Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Как скопировать часть картинки ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
2-1318975668
Gu
2011-10-19 02:07
2012.01.29
номер недели


15-1318427502
Бездомный
2011-10-12 17:51
2012.01.29
Юморок


2-1318669158
Тима12
2011-10-15 12:59
2012.01.29
Отладка программы


2-1318866159
Gu
2011-10-17 19:42
2012.01.29
Установка VersionInfo


2-1319188793
igorium
2011-10-21 13:19
2012.01.29
Как рисовать на канве картинки, которая не помещается на экран?