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

Вниз

склеивание изображения   Найти похожие ветки 

 
Незнайка   (2008-03-31 01:27) [0]

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

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


 
{RASkov} ©   (2008-03-31 02:45) [1]

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

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


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

Итак, в 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?


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

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

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

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


 
{RASkov} ©   (2008-03-31 23:18) [4]

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

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


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

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


 
{RASkov} ©   (2008-04-01 08:27) [6]

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

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


 
antonn ©   (2008-04-01 08:49) [7]

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


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

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

bmp1.Assign(image1.Picture);

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


 
{RASkov} ©   (2008-04-02 10:46) [9]

> [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 17:37) [10]

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

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?


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

Взял вот такой код с 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;


 
{RASkov} ©   (2008-04-02 21:33) [12]

> [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;


 
{RASkov} ©   (2008-04-02 21:45) [13]

> [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... Удачи)


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

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



Страницы: 1 вся ветка

Текущий архив: 2010.10.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
3-1246438693
nachi
2009-07-01 12:58
2010.10.17
посчитать сумму параметров дочерних эл-тов_continue


15-1279082987
Двенадцать
2010-07-14 08:49
2010.10.17
Соседи


15-1279474081
Пазитроныч
2010-07-18 21:28
2010.10.17
Ваше отношение к удаленным образовательным технологиям?


15-1279094692
Knight
2010-07-14 12:04
2010.10.17
Можно ли на Data Module поместить сетевые компоненты?


15-1279144743
Димон
2010-07-15 01:59
2010.10.17
Как передать файл на телефон по блютуз?