![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как скопировать часть картинки ? [D7, XP]
igorium © (2011-10-13 13:00:00)Всем привет.
Есть Image1, в который загружаю картинку из файла.
Есть Image2, в который загружаю картинку из предыдущего Image.
Image1 и Image2 расположены на разных формах.
Image1.width = 2 * Image2.width
Image1.height = 2 * Image2.height
Задача - сохранить картинку из Image1, причем ширина и высота графического файла должны быть равны ширине и высоте Image2.
Вроде все просто - Canvas.CopyRect и вперед.
НО проблема именно в том, что Image1 и Image2 не совпадают по размерам.
В итоге у меня сохраняется только 1/4 изображения.
Может еще проблема в копировании Image1 -> Image2 ?
Я делаю так:
Clipboard.Assign(Image1.Picture); // копирую через буфер
Image2.Picture.Assign(Clipboard);
Clipboard.Clear;
igorium (2011-10-16 17:13:00) [1]Разобрался.
Оказалось, что перед CopyRectнадо ставить StretchDraw
igorium (2011-10-15 13:36:00) [2]У меня совсем лыжи не едут :(
Вот мой код:
procedure TTreeForm.mSaveClick(Sender: TObject);
var FileName : string;
saveBMP, tempBMP : TBitmap;
saveJPG, tempJPG : TJpegImage;
i : integer;
begin
if mySaveDialog.Execute then begin
FileName := mySaveDialog.FileName;
saveBMP := TBitmap.Create;
saveBMP.Height := JPG_H; // Высота картинки
saveBMP.Width := JPG_W*Count_persons; // ширина картинки = ( ширина каждой картинки * количество картинок )
saveBMP.IgnorePalette := true;
tempBMP := TBitmap.Create;
tempBMP.IgnorePalette := true;
for i := 1 to Count_persons do begin
tempBMP.Assign(MyPerson[i].imFoto.Picture.Bitmap);
tempBMP.Height := MyPerson[i].imFoto.Picture.Height; // Высота картинки
tempBMP.Width := MyPerson[i].imFoto.Picture.Width; // Ширина картинки
saveBMP.Canvas.CopyRect(Rect(JPG_W*(i-1), 0, JPG_W*i, JPG_H),
tempBMP.Canvas,
Rect(0, 0, tempBMP.Width, tempBMP.Height));
end;
saveBMP.SaveToFile(FileName + '.bmp'); // zzz удалить после тестов
saveJPG := TJpegImage.Create;
saveJPG.Assign(saveBMP);
saveJPG.SaveToFile(FileName + '.jpg');
saveJPG.Assign(tempBMP);
saveJPG.SaveToFile(FileName + '_2.jpg');
tempBMP.Free;
saveJPG.Free;
end;
end;
Файл, который я сохраняю черезsaveJPG.Assign(saveBMP)показывает мне бяку (см. cskre на принтскрин в комментарии №6).
Но файл, который я сохраняю черезsaveJPG.Assign(tempBMP)показывает мне нормальную картинку.
Т.е. получается, что проблема в CopyRect, хотя там вроде все нормально. Как так получается ???
И. Павел (2011-10-14 12:39:00) [3]> [9] И. Павел © (14.10.11 12:37)
В вашем случае вместо пункта 4 может быть копирование из одной канвы в другую.
И. Павел (2011-10-14 12:37:00) [4]1. Открываете файл в TJPEGImage
2. Преобразуете TJPEGImage в битмап
3. Работаете с этим битмапом
4. Преобразуете его опять в Jpg
Вот так выполняются преобразования: http://www.scalabium.com/faq/dct0042.htm
igorium (2011-10-14 11:55:00) [5]
> И. Павел © (14.10.11 10:50) [7]
> Для работы с Jpg-файлами используйте класс TJpegImage.
Как ?
Я создаю Image:
myJPG := TJPEGImage.Create;
myJPG.Height := JPG_H;
myJPG.Width := JPG_W*Count_persons;
А дальше как скопировать из Image в myJPG часть картинки?
И. Павел (2011-10-14 10:50:00) [6]> [6] igorium © (14.10.11 10:42)
Для работы с Jpg-файлами используйте класс TJpegImage.
igorium (2011-10-14 10:42:00) [7]
> И. Павел © (13.10.11 13:51) [5]
> Укажите разные размеры для исходного и результирующего TRect.
Спасибо заработало.
Только теперь появилась еще одна проблема - я в Image загружаю фотографии Jpeg. При использовании CopyRect новый Image становится нормального размера, но искажаются цвета - http://s017.radikal.ru/i443/1110/35/c76e99e14f40.jpg
Как такую напасть победить?
И. Павел (2011-10-13 13:51:00) [8]> Укажите разные размеры для результирующего TRect.
Укажите разные размеры для исходного и результирующего TRect.
И. Павел (2011-10-13 13:50:00) [9]Укажите разные размеры для результирующего TRect.
"CopyRect копирует прямоугольную область (параметр Source) исходного холста (параметр Canvas) в прямоугольную область (Dest) результирующего холста. Если исходный и результирующий прямоугольники имеют разные размеры, копируемый образ растягивается для совпадения с результирующим прямоугольником"
igorium (2011-10-13 13:40:00) [10]Я сохраняю так:
myBMP.Canvas.CopyRect(Rect(0, 0, Im_First.Width, Im_First.Height),
imFoto.Canvas,
Rect(0, 0, Im_First.Width, Im_First.Height));
Может здесь ошибка?
igorium (2011-10-13 13:20:00) [11]
> TImage.Stretch := True;
Так у меня в обоих Image стоит
TImage.Stretch := True
Ega23 (2011-10-13 13:07:00) [12]
TImage.Stretch := True;