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

Вниз

Как отобразить одну картинку на другой?   Найти похожие ветки 

 
leonidus   (2007-11-30 00:20) [0]

Суть проблемы: есть два файла, один это большая картинка скажем 1024 на 768, второй маленькая, скажем 100 на 100. Нужно нарисовать маленькое изображение на большом, ну т.е. "слепить" их. Думал сделать так:

 btm_big:=tbitmap.Create;
 jpg_big:=TJpegImage.Create;
 jpg_big.LoadFromFile(edit1.text);
 btm_big.Assign(jpg_big);

 btm_small:=tbitmap.Create;
 jpg_small:=TJpegImage.Create;
 jpg_small.LoadFromFile(edit2.text);
 btm_small.Assign(jpg_big);

 btm_big.Canvas.Draw(100,100,btm_small);

 jpg_big.Assign(btm_big);
 jpg_big.SaveToFile(edit1.Text+".jpeg");

Но что-то ничего не выходит...


 
{RASkov} ©   (2007-11-30 01:16) [1]

> btm_big.Assign(jpg_big);


> btm_small.Assign(jpg_big);

Ты один в один перенес код?

Вот практически тоже самое, что и у тебя.... только что проверил - работает:

var Bmp: TBitMap; Jpg: TJPEGImage;
begin
 Bmp:=TBitMap.Create;
 Jpg:=TJPEGImage.Create;
 try
 if OPD.Execute then begin //OPD - TOpenPictureDialog
  Jpg.LoadFromFile(OPD.FileName);
  Bmp.Assign(Jpg);
 end else Exit;
 if OPD.Execute then begin
  Jpg.LoadFromFile(OPD.FileName);
  Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, Jpg);
 end else Exit;
 Jpg.Assign(Bmp);
 Canvas.Draw(10, 10, Jpg);  //Канва формы
 Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+"1.jpg");
 finally
  Bmp.Free;
  Jpg.Free;
 end;
end;


 
{RASkov} ©   (2007-11-30 01:27) [2]

Комментарий к коду в [1]
"В первом" ОпенДиалоге выбираем фоновую картинку Jpeg формата,
"Во втором" - выбираем "логотипчик", т.е. маленькую картинку Jpeg формата,
Затем получившееся "добро" рисуется на форме и сохраняется в файле 1.jpg "рядом" с экзешником...
"Желательно" что бы фон был на порядок больше чем логотипчик....
"Логотипчик" отрисовывается в нижнем правом углу "фона".


 
leonidus   (2007-11-30 13:10) [3]

{RASkov} большое спасибо, ваш код действительно работает.
Но тогда вопрос в продолжение. Если картинка прямоугольная то все ок, но мне нужно перед склеиванием маленькую картинку повернуть на некий угол, при этом я получаю прямоугольник с картинкой и соотв. белыми уголками (маленькую картинку я разворачиваю в фотошопе). Но мне они не нужны, а нужно что бы они были прозрачны. Делаю так:

var
Bmp: TBitMap; Jpg: TJPEGImage;
OldBkMode:integer;
begin
Bmp:=TBitMap.Create;
Jpg:=TJPEGImage.Create;
try
 if OPD.Execute then begin //OPD - TOpenPictureDialog
  Jpg.LoadFromFile(OPD.FileName);
  Bmp.Assign(Jpg);
 end else Exit;

 if OPD.Execute then begin
  Jpg.LoadFromFile(OPD.FileName);
  OldBkMode := SetBkMode(bmp.Canvas.Handle, TRANSPARENT);

  Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, Jpg);
  SetBkMode(bmp.Canvas.Handle, OldBkMode);
 end else Exit;

 Jpg.Assign(Bmp);
 Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+"1.jpg");
finally
 Bmp.Free;
 Jpg.Free;
end;

Но не пашет. Мне так удавалось раньше текст прозрачный размещать, но вот с картинкой затык...


 
{RASkov} ©   (2007-11-30 13:48) [4]

> [3] leonidus   (30.11.07 13:10)

Попробуй вот так:
var Bmp, TmpBmp: TBitMap; Jpg: TJPEGImage;
begin
 Bmp:=TBitMap.Create;
 Jpg:=TJPEGImage.Create;
 try
  if OPD.Execute then begin //OPD - TOpenPictureDialog
   Jpg.LoadFromFile(OPD.FileName);
   Bmp.Assign(Jpg);
  end else Exit;
  if OPD.Execute then begin
   TmpBmp:=TBitMap.Create;
   try
    Jpg.LoadFromFile(OPD.FileName);
    TmpBmp.Assign(Jpg);
    TmpBmp.TransparentColor:=TmpBmp.Canvas.Pixels[0,0];
    TmpBmp.Transparent:=True;
    Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, TmpBmp);
   finally
    TmpBmp.Free;
   end;
  end else Exit;
  Canvas.Draw(10, 35, Bmp);
  Jpg.Assign(Bmp);
  Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+"2.jpg");
 finally
  Bmp.Free;
  Jpg.Free;
 end;
end;

Только я не думаю, что это "правильный" вариант.... с транспорентами, поворотами - нужен более профессианальный подход....
Можно посмотреть в кладовке "демку" от antonn"а. Пример помоему называется Scanline.... Как раз для твоих целей....)


 
{RASkov} ©   (2007-11-30 13:55) [5]

> [3] leonidus   (30.11.07 13:10)
> ваш код действительно работает.

:)
Это не мой.... это твой код, я просто оформил его "по своему"....
Сравни с [0] - "один в один" :)
В [1] было замечание по jpg_big.... т.е. и большой битмап и маленький ассигнились с одним и тем же джепегом....


 
leonidus   (2007-11-30 14:26) [6]

Код работает прекрасно. Большое спасибо. А почему вы считает что это не профессиональный подход?


 
{RASkov} ©   (2007-11-30 14:34) [7]

> [6] leonidus   (30.11.07 14:26)
> А почему вы считает что это не профессиональный подход?

Поэксперементируй с разными фонами и разными лого (причем бери обычные джепег картинки, а не подготовленные специально для этого) и ты увидешь "проблему стандартного подхода" к битмапам.....
хотябы тот же транспарент.... он не будет таким гладким, как хотелось бы
В общем удачи..... я рад что тебе вполне хватило и кода выше :)


 
leonidus   (2007-11-30 19:36) [8]

Я понял уже, буду экспериментировать. Спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1244202663
KSergey
2009-06-05 15:51
2009.08.09
Параметры (прокси) для аккаутна system


15-1244444698
Cerberus
2009-06-08 11:04
2009.08.09
Проблемы локальной сети.


15-1243872383
vrem
2009-06-01 20:06
2009.08.09
Локальный сайт при включенном интернете - как?


2-1244711390
Petr
2009-06-11 13:09
2009.08.09
Поиск числа


2-1244445645
Демон
2009-06-08 11:20
2009.08.09
Build with runtime packages