Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1282384267
MSV
2010-08-21 13:51
2012.01.29
Двустрорнняя печать


2-1318634868
Romancaw
2011-10-15 03:27
2012.01.29
Как при помощи Sendinput отправить текст из tEdit?


3-1270538121
kudatsky
2010-04-06 11:15
2012.01.29
Оцените эффективность запроса в FireBird


1-1282631144
Avil
2010-08-24 10:25
2012.01.29
Разница кодировок при копировании и вставке


4-1254333344
EPaul
2009-09-30 21:55
2012.01.29
Как запустить программу пользователем SYSTEM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский