Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как скопировать часть картинки ? [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо