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

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

склеивание изображения [D7, WinXP]


Незнайка ©   (2008-03-31 01:27:00) 

У меня есть два изображения. Задача следующая, нужно пристыковать к первому изображению справа или с низу второе изображение и сохранить результат. Размеры изображений одинаковые. Подскажите, как это можно сделать?

Заранее спасибо.


Незнайка   (2008-04-02 23:13:00) [1]

Класс, все работает, спасибо!!!


{RASkov}   (2008-04-02 21:45:00) [2]

> [10] Незнайка   (02.04.08 17:37)
> bmp.Canvas.Draw(0,0,image1.Picture.bitmap); после этого
> выполнения, стирается изображение в image1 и в bmp ничего
> не переносится

Потому как в TGraphic(image1.Picture. bitmap) ничего нет мы ж не битмап загрузили, верно?
Кстати.... попробуй так: bmp.Canvas.Draw(0,0,image1.Picture.graphic);;)

> [11] Незнайка   (02.04.08 17:51) вторая часть

Тоже самое... ты ж к битмапу тыркаешься, а в контейнере jpeg... Удачи)


{RASkov}   (2008-04-02 21:33:00) [3]

> [11] Незнайка   (02.04.08 17:51)

uses Jpeg, Math;

procedure TForm1.Button1Click(Sender: TObject);
var JPG1, JPG2, JPG_Out: TJPEGImage; BMP: TBitMap;
begin
  JPG1:=TJPEGImage.Create;
  JPG2:=TJPEGImage.Create;
  try
   JPG1.LoadFromFile('1.jpg');
   JPG2.LoadFromFile('2.jpg');
   BMP:=TBitMap.Create;
   try
    BMP.Width:=Max(JPG1.Width, JPG2.Width);
    BMP.Height:=JPG1.Height+JPG2.Height;
    BMP.Canvas.Draw(0, 0, JPG1);
    BMP.Canvas.Draw(0, JPG1.Height, JPG2);
    JPG_Out:=TJPEGImage.Create;
    try
     JPG_Out.Assign(BMP);
     JPG_Out.SaveToFile('3.jpg');
    finally
     JPG_Out.Free;
    end;
   finally
    BMP.Free;
   end;
  finally
   JPG1.Free; JPG2.Free;
  end;
end;


Незнайка   (2008-04-02 17:51:00) [4]

Взял вот такой код с BMP работает как часы, на все 100

image1.Picture.LoadFromFile('C:\0.bmp');
image2.Picture.LoadFromFile('C:\0a.bmp');
image3.Picture.LoadFromFile('C:\0.bmp');
image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                                         image2.Picture.bitmap.width;
image3.Picture.Bitmap.Canvas.Draw(image2.Picture.bitmap.width,0,image2.Picture.b itmap);


Вот такой код тоже самое но JPG уже не работает, изображения выбираются из image1 и image2, в image3 никаких результатов

image1.Picture.LoadFromFile('C:\0.jpg');
image2.Picture.LoadFromFile('C:\0a.jpg');
image3.Picture.LoadFromFile('C:\0.jpg');
image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                              image2.Picture.bitmap.width;
image3.Picture.Bitmap.Canvas.Draw(image2.Picture.bitmap.width,0,image2.Picture.b itmap);


причем исчезновение изображения пропадает уже после

image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                              image2.Picture.bitmap.width;


Незнайка   (2008-04-02 17:37:00) [5]

вот если исходник джепеги то ничего не выходит

image1.Picture.LoadFromFile('C:\1.jpg');
image2.Picture.LoadFromFile('C:\1a.jpg');
bmp := TBitmap.Create;
...
bmp.width:=image1.Picture.bitmap.width;
bmp.height:=image1.Picture.bitmap.heigth+image2.Picture.bitmap.height;
bmp.Canvas.Draw(0,0,image1.Picture.bitmap);
...


bmp.Canvas.Draw(0,0,image1.Picture.bitmap);после этого выполнения, стирается изображение в image1 и в bmp ничего не переносится

т.е. если в Image1 и Image2 хранится не bmp а jpg то ничего не получается
возможно ли изображение jpg из Image1 взять как bmp?


{RASkov}   (2008-04-02 10:46:00) [6]

> [8] Незнайка   (02.04.08 03:12)
> А как работать с jpg?

Для этих нужно
uses ...., Jpeg;

ну и TJPEGImage;
Но тебе нужно все равно делать через временный bmp....

var
BMP: TBitmap; JPG: TJPEGImage;
begin
//загрузить исходное изображение
image1.Picture.LoadFromFile('C:\1.bmp');
image2.Picture.LoadFromFile('C:\1a.bmp');

bmp := TBitmap.Create;
try
 bmp.width:=image1.Picture.bitmap.width;
 bmp.height:=image1.Picture.bitmap.heigth+image2.Picture.bitmap.height;
 bmp.Canvas.Draw(0,0,image1.Picture.bitmap);
 bmp.Canvas.Draw(0,image1.Picture.bitmap.heigth, image2.Picture.bitmap);
 JPG:=TJPEGImage.create;
 try
  JPG.Assign(BMP);
  JPG.SaveToFile('C:\3.jpg'); // сохраняем результат на диск
 finally
  jpg.Free;
 end;
finally
 bmp.Free;
end;
end;

Если у тебя исходные файлы "джепеги", то переделай чуток код....


Незнайка   (2008-04-02 03:12:00) [7]

с форматом bmp код работает на ура, а вто с jpg выдает ошибку на строке

bmp1.Assign(image1.Picture);

говорит что типы  TPicture и TBitmap несовместимы. Ну это и понятно, мы создали класс TBitmap.
А как работать с jpg?


antonn   (2008-04-01 08:49:00) [8]

и тут я подскажу и всех спасу %)
try..finally


{RASkov}   (2008-04-01 08:27:00) [9]

> [5] Незнайка   (01.04.08 00:37)
> Ага, понял, лишнее убрал

Да, но кое чего не хватает в коде :) Смотри, если вдруг например строка:
> bmp3.SaveToFile('C:\3.bmp'); // сохраняем результат на диск
вызовет исключение, то что будет? Точно, утёкбитмап...:(
:о)


Незнайка   (2008-04-01 00:37:00) [10]

Ага, понял, лишнее убрал :)


{RASkov}   (2008-03-31 23:18:00) [11]

> [3] Незнайка   (31.03.08 21:38)
> {RASkov} Спасибо за подсказку

Спасибо-то... спасибо.... т.е. пожалуйста, но только вот в [2] ужас какой-то :) Я не так подсказывал )
В прочем не то что бы ужас, но имеется лишнее....
Временного битмапа достаточно одного...


Незнайка   (2008-03-31 21:38:00) [12]

вопрос снят :)

Простое использование Width и Height

{RASkov}Спасибо за подсказку


Незнайка   (2008-03-31 21:17:00) [13]

Итак, в Image1 поместил первое изображение, в Image2 второе
размер изображений 100х100.

var
 bmp1, bmp2, bmp3: TBitmap;
begin
 //загрузить исходное изображение
 image1.Picture.LoadFromFile('C:\1.bmp');
 image2.Picture.LoadFromFile('C:\1a.bmp');

 bmp1 := TBitmap.Create;
 bmp2 := TBitmap.Create;
 bmp3 := TBitmap.Create;

 bmp1.Assign(image1.Picture);
 bmp2.Assign(image1.Picture);
 bmp3.Assign(bmp1);            
 BitBlt(bmp3.Canvas.Handle, 100, 0, 100, 100,
         bmp2.Canvas.Handle, 0, 0, SRCCOPY);

 bmp3.SaveToFile('C:\3.bmp'); // сохраняем результат на диск
 image2.Picture.LoadFromFile('C:\3.bmp');
 bmp1.Free; bmp2.Free; bmp3.Free;
end;

но ничего не происходит

если в  BitBlt по координате х поставит 50

BitBlt(bmp3.Canvas.Handle, 50, 0, 100, 100, bmp2.Canvas.Handle, 0, 0, SRCCOPY);

то все работает, но первое изображение и второе усечено на половину. Т.е. при выполнении

bmp3.Assign(bmp1);

Canvas задается размером 100х100 и поэтому за его приделами ничего не рисуется. Как изменить (увеличить)  размеры Canvas?


{RASkov}   (2008-03-31 02:45:00) [14]

> [0] Незнайка   (31.03.08 01:27)

два изображения - это два холста? Это имелось в виду?... т.е. Канва Битмапов например....
Создать "третье изображение" установив ему нужные размеры, ну и методы холстов или работа с холстом: CopyRect например, или Draw.... также есть BitBlt - тоже может помочь...


Наверх

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