Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как поместить в ImageList jpeg рисунки

1.9K
18 февраля 2005 года
elderb
61 / / 26.01.2004
В программе есть ListView, который может отображать элемты списка в виде иконок. Иконки должны быть уменьшенными копимя фотографий работников (как в ХР если сделать вид папки "Эскизы страниц"). Сами фотки находятся на дискен в папке. То есть алгоритм такой
1. загружаю фотки по очереди (в TBitmap или Image)
2. Уменьшаю масштаб, так что бы не изменились пропорции (CopyRect или ScratchBlt)
3. Помещаю в Imagelist и тут же закрепляю за элементом списка.
ListView1->Items->Item[cnum]->ImageIndex=ImageList->Add(bmp1 ,NULL);

Возникают следующие проблемы
1. Jpg файлы не грузятся в TBitmap Ошибка:"Bitmap image is not valide"(#include "jpeg.hpp" - есть)
2. Масштаб уменьшаю исходя из геометрии. Здесь все нормально, Но вот нет ли какого нибудь метода для битмапа, как у Image->Scratch и Proportional
3. ImageList упорно не хочет принимать битмапы отличне по размерам от ImageList->Width ImageList->Height. Хотя если наполнять его вручную он прекрасно подгоняет битмапы, сохраняя пропоции.

Можно ли реализовать эту задачу как нибудь проще?
259
18 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by elderb
В программе есть ListView, который может отображать элемты списка в виде иконок. Иконки должны быть уменьшенными копимя фотографий работников (как в ХР если сделать вид папки "Эскизы страниц"). Сами фотки находятся на дискен в папке. То есть алгоритм такой
1. загружаю фотки по очереди (в TBitmap или Image)
2. Уменьшаю масштаб, так что бы не изменились пропорции (CopyRect или ScratchBlt)
3. Помещаю в Imagelist и тут же закрепляю за элементом списка.
ListView1->Items->Item[cnum]->ImageIndex=ImageList->Add(bmp1 ,NULL);

Возникают следующие проблемы
1. Jpg файлы не грузятся в TBitmap Ошибка:"Bitmap image is not valide"(#include "jpeg.hpp" - есть)
2. Масштаб уменьшаю исходя из геометрии. Здесь все нормально, Но вот нет ли какого нибудь метода для битмапа, как у Image->Scratch и Proportional
3. ImageList упорно не хочет принимать битмапы отличне по размерам от ImageList->Width ImageList->Height. Хотя если наполнять его вручную он прекрасно подгоняет битмапы, сохраняя пропоции.

Можно ли реализовать эту задачу как нибудь проще?


см. здесь http://forums.progers.ru/index.php?showtopic=36

1.9K
18 февраля 2005 года
elderb
61 / / 26.01.2004
Цитата:
Originally posted by AlexandrVSmirno

см. здесь http://forums.progers.ru/index.php?showtopic=36

Спасибо за совет джпег действительно загрузился.
AlexandrVSmirno если не в тягость , подскажи почему этот код масштабирования ничего не отображает в Image?

Цитата:

TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage),
"jpg", "jpg", __classid(TJPEGImage));
Graphics::TBitmap *bmp=new Graphics::TBitmap;
Pic->LoadFromFile("c:\\1.jpg");
TRect src=Rect(0,0,100,100);
TRect dest=Rect(0,0,10,10);
bmp->Canvas->CopyRect(dest,Pic->Bitmap->Canvas,src);
Image1->Picture->Bitmap->Assign(bmp);

259
18 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by elderb
Спасибо за совет джпег действительно загрузился.
AlexandrVSmirno если не в тягость , подскажи почему этот код масштабирования ничего не отображает в Image?


Попробуй вместо
bmp->Canvas->CopyRect(dest,Pic->Bitmap->Canvas,src);
Image1->Picture->Bitmap->Assign(bmp);

Image1->Picture->Bitmap->Canvas->CopyRect(dest,Pic->Bitmap->Canvas,src);

1.9K
18 февраля 2005 года
elderb
61 / / 26.01.2004
Цитата:
Originally posted by AlexandrVSmirno

Попробуй вместо
bmp->Canvas->CopyRect(dest,Pic->Bitmap->Canvas,src);
Image1->Picture->Bitmap->Assign(bmp);

Image1->Picture->Bitmap->Canvas->CopyRect(dest,Pic->Bitmap->Canvas,src);


К сожалению не работает. :(
Может тут проблема на уровне отношений Picture->Bitmap TBitmap *bmp, они ведут себя так будто они не равноправны?
Причем с бмп файлами у меня ввсе получалось и через CopyRect и через BitBlt. А сейчас не работает даже:

Цитата:

Graphics::TBitmap *bmp=new Graphics::TBitmap;
TPicture *Pic = new TPicture(); Pic->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg", __classid(TJPEGImage)); Pic->LoadFromFile("c:\\1.jpg");
HDC dc; dc=GetDC(bmp); BitBlt(Pic->Bitmap->Canvas->Handle,0,0,100,100,dc,0,0,SRCCOPY); Image1->Picture->Bitmap->Assign(bmp);


Результат тот же самый Image даже не перерисовывается :(((

1.9K
18 февраля 2005 года
elderb
61 / / 26.01.2004
Прошу прощения, предыдущий код помялся поэтому высылаю еще раз.
Цитата:

Graphics::TBitmap *bmp=new Graphics::TBitmap;

TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg", __classid(TJPEGImage));

Pic->LoadFromFile("c:\\1.jpg");
HDC dc;
dc=GetDC(bmp);

BitBlt(Pic->Bitmap->Canvas->Handle,0,0,100,100,dc,0,0,SRCCOPY);

Image1->Picture->Bitmap->Assign(bmp);

259
18 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by elderb

К сожалению не работает. :(
Может тут проблема на уровне отношений Picture->Bitmap TBitmap *bmp, они ведут себя так будто они не равноправны?
Причем с бмп файлами у меня ввсе получалось и через CopyRect и через BitBlt. А сейчас не работает даже:

Результат тот же самый Image даже не перерисовывается :(((


Да фиг его знает. Вроде все правильно. Нужно подумать.

487
19 февраля 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by elderb
Прошу прощения, предыдущий код помялся поэтому высылаю еще раз.



А пробовал делать так:

 
Код:
TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage),
"jpg", "jpg", __classid(TJPEGImage));
Graphics::TBitmap *bmp=new Graphics::TBitmap;
Pic->LoadFromFile("c:\\1.jpg");
TRect dest=Rect(0,0,10,10);
Image1->Picture->Bitmap->Canvas->StretchDraw(dest,Pic);
Image1->Refresh();// Как вариант Image1->Repaint();


Кстати о птичках.


HDC dc;
dc=GetDC(bmp);


Как это у тебя вообще могло работать?
См. хелп:


HDC GetDC
(
HWND hWnd // handle of window
);


Ты вместо хэндла окна передаешь указатель на класс - о котором WinAPI вообще никакого представления не имеет. Как ты думаешь что вернется в результате?

К тому-же если тебе нужен DC битмапа - это делается гораздо проще:

 
Код:
HDC dc;
Graphics::TBitmap *bmp=new Graphics::TBitmap;
dc=bmp->Canvas->Handle;


Далее:
Создаешь и работаешь с битмапой - а размеры для нее не инициализируешь.

 
Код:
Graphics::TBitmap *bmp=new Graphics::TBitmap;
TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg", __classid(TJPEGImage));
Pic->LoadFromFile("c:\\1.jpg");

// задаем размеры битмапа
bmp->Width=Pic->Width;
bmp->Height=Pic->Height;


Далее - смотрим хелп по BitBlt:

BitBlt(
HDC hdcDest, // handle to destination device


И что получается в твоем случае?
Ты канву ЗАГРУЖЕНОЙ картинки перетираешь неинициализированными данными. В результате - естественно ничего и не нарисуется.

Поэтому надо делать так:

 
Код:
BitBlt(dc,0,0,100,100,Pic->Bitmap->Canvas->Handle,0,0,SRCCOPY);
1.9K
21 февраля 2005 года
elderb
61 / / 26.01.2004
Цитата:
Originally posted by ddnh_bc

HDC dc;
dc=GetDC(bmp);

Как это у тебя вообще могло работать?


Действительно этот момент я пропустил. Спасибо за подсказку.
Правда проблема не решилась, к сожалениею оба примера не работают :o
В первой строке:
[code
Image1->Picture->Bitmap->Canvas->StretchDraw(dest,Pic);
[/code]
Вместо объекта TPicture нужен TGrphic, подойдет и TBitmap, но реакция та же Iмage не перерисовывается доже после Repaint (может я что то не так делаю?)
Во вотором с правильным хендлом битмап в Image отображается но только он пустой.
Только что нашел причину. Вот выдержка из хелпа, поясняющая это ограничение битмапа в TPicture:

Цитата:
Use Bitmap to reference the picture object when it contains a bitmap. If Bitmap is referenced when the picture contains a Drawing or Icon graphic, the graphic won't be converted. Instead, the original contents of the picture are discarded and Bitmap returns a new, blank bitmap.
Note: When assigning the Bitmap property, TPicture assigns the properties of a another TBitmap object. It does not take ownership of the specified value.

Т.е TPicture не сможет конвертировать Jpeg то bmp.
В классе TPicture есть еще метод SaveToMimeSource можно ли конвертировать рисунок через него? Можно ли как-то обойти это ограничение?

1.9K
21 февраля 2005 года
elderb
61 / / 26.01.2004
Нашел. Для хранения джпела нужно использовать класс TJPEGImage
вот код реализующий задачу масштабирования
Код:
Graphics::TBitmap * bmp = new Graphics::TBitmap;
Graphics::TBitmap * bmp1 = new Graphics::TBitmap;
TJPEGImage * examp = new TJPEGImage;
examp->LoadFromFile("C:\\1.jpg");
TRect src=Rect(0,0,200,200);
TRect dest=Rect(0,0,10,10);
bmp1->Width=20;
bmp1->Height=20;
bmp->Assign(examp);
bmp1->Canvas->CopyRect(dest,bmp->Canvas,src);
Canvas->Draw(10,10,bmp1);
delete examp;

Всем спасибо.
487
24 февраля 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by elderb
Нашел. Для хранения джпела нужно использовать класс TJPEGImage
вот код реализующий задачу масштабирования
Код:
Graphics::TBitmap * bmp = new Graphics::TBitmap;
Graphics::TBitmap * bmp1 = new Graphics::TBitmap;
TJPEGImage * examp = new TJPEGImage;
examp->LoadFromFile("C:\\1.jpg");
TRect src=Rect(0,0,200,200);
TRect dest=Rect(0,0,10,10);
bmp1->Width=20;
bmp1->Height=20;
bmp->Assign(examp);
bmp1->Canvas->CopyRect(dest,bmp->Canvas,src);
Canvas->Draw(10,10,bmp1);
delete examp;

Всем спасибо.



А хочешь еще один пример реализации?
Проверено - работает. Предполагается, что у тебя на форме есть тот самый TImage *Image1.

 
Код:
Image1->Stretch=true;
Image1->Picture->RegisterFileFormat(__classid(TJPEGImage),"jpg","jpg",__classid(TJPEGImage));
Image1->Picture->LoadFromFile("C:\\1.jpg");


А касаемо того с чего начинался разговор - вот как это должно было быть реализовано:

 
Код:
TRect dest=Rect(0,0,Image1->Width,Image1->Height);
TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage),"jpg", "jpg",__classid(TJPEGImage));
Pic->LoadFromFile("C:\\1.jpg");
Image1->Canvas->StretchDraw(dest,Pic->Graphic);


Понял где были ошибки?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог