Как поместить в ImageList jpeg рисунки
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. Хотя если наполнять его вручную он прекрасно подгоняет битмапы, сохраняя пропоции.
Можно ли реализовать эту задачу как нибудь проще?
В программе есть 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. Хотя если наполнять его вручную он прекрасно подгоняет битмапы, сохраняя пропоции.
Можно ли реализовать эту задачу как нибудь проще?
Спасибо за совет джпег действительно загрузился.
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);
Спасибо за совет джпег действительно загрузился.
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);
Попробуй вместо
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 даже не перерисовывается :(((
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);
К сожалению не работает. :(
Может тут проблема на уровне отношений Picture->Bitmap TBitmap *bmp, они ведут себя так будто они не равноправны?
Причем с бмп файлами у меня ввсе получалось и через CopyRect и через BitBlt. А сейчас не работает даже:
Результат тот же самый Image даже не перерисовывается :(((
Да фиг его знает. Вроде все правильно. Нужно подумать.
Прошу прощения, предыдущий код помялся поэтому высылаю еще раз.
А пробовал делать так:
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 битмапа - это делается гораздо проще:
Graphics::TBitmap *bmp=new Graphics::TBitmap;
dc=bmp->Canvas->Handle;
Далее:
Создаешь и работаешь с битмапой - а размеры для нее не инициализируешь.
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
И что получается в твоем случае?
Ты канву ЗАГРУЖЕНОЙ картинки перетираешь неинициализированными данными. В результате - естественно ничего и не нарисуется.
Поэтому надо делать так:
HDC dc;
dc=GetDC(bmp);
Как это у тебя вообще могло работать?
Действительно этот момент я пропустил. Спасибо за подсказку.
Правда проблема не решилась, к сожалениею оба примера не работают :o
В первой строке:
[code
Image1->Picture->Bitmap->Canvas->StretchDraw(dest,Pic);
[/code]
Вместо объекта TPicture нужен TGrphic, подойдет и TBitmap, но реакция та же Iмage не перерисовывается доже после Repaint (может я что то не так делаю?)
Во вотором с правильным хендлом битмап в Image отображается но только он пустой.
Только что нашел причину. Вот выдержка из хелпа, поясняющая это ограничение битмапа в TPicture:
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 можно ли конвертировать рисунок через него? Можно ли как-то обойти это ограничение?
вот код реализующий задачу масштабирования
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;
Всем спасибо.
Нашел. Для хранения джпела нужно использовать класс TJPEGImage
вот код реализующий задачу масштабирования
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->Picture->RegisterFileFormat(__classid(TJPEGImage),"jpg","jpg",__classid(TJPEGImage));
Image1->Picture->LoadFromFile("C:\\1.jpg");
А касаемо того с чего начинался разговор - вот как это должно было быть реализовано:
TPicture *Pic = new TPicture();
Pic->RegisterFileFormat(__classid(TJPEGImage),"jpg", "jpg",__classid(TJPEGImage));
Pic->LoadFromFile("C:\\1.jpg");
Image1->Canvas->StretchDraw(dest,Pic->Graphic);
Понял где были ошибки?