![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
склеивание изображения [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 - тоже может помочь...