-
У меня есть два изображения. Задача следующая, нужно пристыковать к первому изображению справа или с низу второе изображение и сохранить результат. Размеры изображений одинаковые. Подскажите, как это можно сделать?
Заранее спасибо.
-
> [0] Незнайка (31.03.08 01:27)
два изображения - это два холста? Это имелось в виду?... т.е. Канва Битмапов например.... Создать "третье изображение" установив ему нужные размеры, ну и методы холстов или работа с холстом: CopyRect например, или Draw.... также есть BitBlt - тоже может помочь...
-
Итак, в 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?
-
вопрос снят :)
Простое использование Width и Height
{RASkov} Спасибо за подсказку
-
> [3] Незнайка (31.03.08 21:38) > {RASkov} Спасибо за подсказку
Спасибо-то... спасибо.... т.е. пожалуйста, но только вот в [2] ужас какой-то :) Я не так подсказывал ) В прочем не то что бы ужас, но имеется лишнее.... Временного битмапа достаточно одного...
-
Ага, понял, лишнее убрал :)
-
> [5] Незнайка (01.04.08 00:37) > Ага, понял, лишнее убрал
Да, но кое чего не хватает в коде :) Смотри, если вдруг например строка: > bmp3.SaveToFile('C:\3.bmp'); // сохраняем результат на диск вызовет исключение, то что будет? Точно, утёк битмап...:( :о)
-
и тут я подскажу и всех спасу %) try..finally
-
с форматом bmp код работает на ура, а вто с jpg выдает ошибку на строке
bmp1.Assign(image1.Picture);
говорит что типы TPicture и TBitmap несовместимы. Ну это и понятно, мы создали класс TBitmap. А как работать с jpg?
-
> [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; Если у тебя исходные файлы "джепеги", то переделай чуток код....
-
вот если исходник джепеги то ничего не выходит 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?
-
Взял вот такой код с 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;
-
> [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;
-
> [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... Удачи)
-
Класс, все работает, спасибо!!!
|