Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
Незнайка   (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 вся ветка

Форум: "Media";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.004 c
2-1279711238
hunt
2010-07-21 15:20
2010.10.17
Отправа POST запроса в форму


15-1279099590
Heretic
2010-07-14 13:26
2010.10.17
В Уголовном праве России появится новый состав преступления — ере


10-1166096876
Styx_
2006-12-14 14:47
2010.10.17
TWebBrowser и JavaScript


15-1278912781
Leonid Troyanovsky
2010-07-12 09:33
2010.10.17
Что там у нас с анкетами?


15-1279102538
Двенадцать
2010-07-14 14:15
2010.10.17
как понимать факт не ошибки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский