Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
ВнизКак скопировать часть картинки ? Найти похожие ветки
← →
igorium © (2011-10-13 13:00) [0]Всем привет.
Есть 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;
← →
Ega23 © (2011-10-13 13:07) [1]
TImage.Stretch := True;
← →
igorium © (2011-10-13 13:20) [2]
> TImage.Stretch := True;
Так у меня в обоих Image стоитTImage.Stretch := True
← →
igorium © (2011-10-13 13:40) [3]Я сохраняю так:
myBMP.Canvas.CopyRect(Rect(0, 0, Im_First.Width, Im_First.Height),
imFoto.Canvas,
Rect(0, 0, Im_First.Width, Im_First.Height));
Может здесь ошибка?
← →
И. Павел © (2011-10-13 13:50) [4]Укажите разные размеры для результирующего TRect.
"CopyRect копирует прямоугольную область (параметр Source) исходного холста (параметр Canvas) в прямоугольную область (Dest) результирующего холста. Если исходный и результирующий прямоугольники имеют разные размеры, копируемый образ растягивается для совпадения с результирующим прямоугольником"
← →
И. Павел © (2011-10-13 13:51) [5]> Укажите разные размеры для результирующего TRect.
Укажите разные размеры для исходного и результирующего TRect.
← →
igorium © (2011-10-14 10:42) [6]
> И. Павел © (13.10.11 13:51) [5]
> Укажите разные размеры для исходного и результирующего TRect.
Спасибо заработало.
Только теперь появилась еще одна проблема - я в Image загружаю фотографии Jpeg. При использовании CopyRect новый Image становится нормального размера, но искажаются цвета - http://s017.radikal.ru/i443/1110/35/c76e99e14f40.jpg
Как такую напасть победить?
← →
И. Павел © (2011-10-14 10:50) [7]> [6] igorium © (14.10.11 10:42)
Для работы с Jpg-файлами используйте класс TJpegImage.
← →
igorium © (2011-10-14 11:55) [8]
> И. Павел © (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 12:37) [9]1. Открываете файл в TJPEGImage
2. Преобразуете TJPEGImage в битмап
3. Работаете с этим битмапом
4. Преобразуете его опять в Jpg
Вот так выполняются преобразования: http://www.scalabium.com/faq/dct0042.htm
← →
И. Павел © (2011-10-14 12:39) [10]> [9] И. Павел © (14.10.11 12:37)
В вашем случае вместо пункта 4 может быть копирование из одной канвы в другую.
← →
igorium © (2011-10-15 13:36) [11]У меня совсем лыжи не едут :(
Вот мой код:
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, хотя там вроде все нормально. Как так получается ???
← →
igorium © (2011-10-16 17:13) [12]Разобрался.
Оказалось, что перед CopyRect надо ставить StretchDraw
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c