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

Вниз

AlphaBlend: наложить bmp на jpg или наоборот   Найти похожие ветки 

 
fredwriter ©   (2012-09-17 16:58) [0]

Здравствуйте, делаю лабу, нужно наложить одно изображение на другое, для этого используется Alpha-наложение при помощи API AlphaBlend. Если выбирается jpg, то я преобразую jpg в bmp и пытаюсь наложить. Если оба выбранных изображения bmp, или оба jpg, то всё накладывается отлично, если одно jpg, а другое bmp, то GetLastError с кодом 87(неверно задан параметр). Понятно, что я как-то недопреобразовал jpg, но информации о том, как правильно сделать не нашел.
Может найдется добрый дядя, который мне поможет?
Вот код:
procedure TForm1.Button1Click(Sender: TObject);
var
 bmp1, bmp2: TBitMap;
 jpg1, jpg2: TJpegImage;
 Blend: TBlendFunction;
 i, j: integer;
 s1, s2: string;
begin
 jpg1 := TJpegImage.Create;
 jpg2 := TJpegImage.Create;
 bmp1 := TBitMap.Create;
 bmp2 := TBitMap.Create;
 try
   i := pos(".", edit1.Text);
   j := pos(".", edit2.Text);
   s1 := Copy(edit1.text, i + 1, 3);
   s2 := Copy(edit2.text, j + 1, 3);
   if ((s1 = "jpg") or (s1 = "jpeg")) and ((s2 = "jpg") or (s2 = "jpeg"))  then //если оба jpg
   begin
     jpg1:=TJPEGImage.Create;
     bmp1:=TBitmap.Create;
     jpg1.CompressionQuality:=100;
     jpg1.Compress;
     jpg1.LoadFromFile(Edit1.Text);
     bmp1.Assign(jpg1);
     jpg2:=TJPEGImage.Create;
     bmp2:=TBitmap.Create;
     jpg2.CompressionQuality:=100;
     jpg2.Compress;
     jpg2.LoadFromFile(Edit2.Text);
     bmp2.Assign(jpg2);
   end;
   if ((s1 = "jpg") or (s1 = "jpeg")) and (s2 = "bmp") then //если первый jpg, а второй bmp
   begin
     jpg1:=TJPEGImage.Create;
     bmp1:=TBitmap.Create;
     jpg1.CompressionQuality:=100;
     jpg1.Compress;
     jpg1.LoadFromFile(Edit1.Text);
     bmp1.Assign(jpg1);
   end;
   if ((s2 = "jpg") or (s2 = "jpeg")) and (s1 = "bmp") then //если первый bmp, а второй jpg
   begin
     jpg2:=TJPEGImage.Create;
     bmp2:=TBitmap.Create;
     jpg2.CompressionQuality:=100;
     jpg2.Compress;
     jpg2.LoadFromFile(Edit2.Text);
     bmp2.Assign(jpg2);
   end;
   if (s1 = "bmp") and (s2 = "bmp") then //если оба bmp
   begin
     bmp1.LoadFromFile(Edit1.Text);
     bmp2.LoadFromFile(Edit1.Text);
   end;
   bmp1.PixelFormat := pf32bit;
   bmp2.PixelFormat := pf32bit;
   Blend.BlendOp := AC_SRC_OVER;
   Blend.BlendFlags := 0;
   Blend.SourceConstantAlpha := ScrollBar1.Position;
   Blend.AlphaFormat := AC_SRC_ALPHA;
   if Windows.AlphaBlend(bmp1.Canvas.Handle, 0, 0, bmp1.Width, bmp1.Height,
              bmp2.Canvas.Handle, 0, 0, bmp2.Width, bmp2.Height, Blend) then
     image1.Canvas.Draw(0, 0, bmp1)
   else
     ShowMessage(IntToStr(GetLastError));
   bmp1.Free;
   bmp2.Free;
 except
   ShowMessage("Не удалось выполнить наложение, проверьте правильность путей" + #10#13 + "для выбранных изображений");
 end;
end;


 
antonn ©   (2012-09-17 17:52) [1]


> i := pos(".", edit1.Text);
>    j := pos(".", edit2.Text);
>    s1 := Copy(edit1.text, i + 1, 3);
>    s2 := Copy(edit2.text, j + 1, 3);

extractfilext(), и не забыть про регистр.

разбирать условия лень, могу показать это http://forum.sources.ru/index.php?showtopic=332418&view=findpost&p=2903423 , мож пригодится.
вообще тут двух условий (на каждый битмап свое) или функции типа этой хватит:
Procedure Load_Bitmap(s:string; var Image:TBitmap);
var jpeg:TJPEGImage; bmp:TBitmap;
begin
if not(fileexists(s)) then exit;
if lowercase(extractfileext(s))=".bmp" then begin
   Image.LoadFromFile(s);
end else begin
  jpeg := TJPEGImage.Create;
 try
   jpeg.CompressionQuality:=100;
   jpeg.LoadFromFile(s);
   bmp:=TBitmap.Create;
   try
     bmp.Assign(jpeg);
     image.Assign(bmp);
   finally
     bmp.Free
   end;
 finally
   jpeg.Free
 end;
end;
end;


 
брат Птибурдукова   (2012-09-18 09:55) [2]


>    s2 := Copy(edit2.text, j + 1, 3);    if ((s1 = "jpg")
> or (s1 = "jpeg")) and ((s2 = "jpg") or (s2 = "jpeg"))  then
> //если оба jpg
Как же ты, скопировав три символа, надеешься получить строку "jpeg"? И почему ты считаешь, что в пути не может быть точки, а обязательно точка отделяет имя от расширения? Читай про ExtractFileExt.


> if ((s1 = "jpg") or (s1 = "jpeg")) and (s2 = "bmp") then
> //если первый jpg, а второй bmp    begin      jpg1:=TJPEGImage.
> Create;      bmp1:=TBitmap.Create;      jpg1.CompressionQuality:
> =100;      jpg1.Compress;      jpg1.LoadFromFile(Edit1.Text);
>       bmp1.Assign(jpg1);    end;

А в Bmp2 у тебя остаётся пустота, так что "наложение не приводит ни к чему. А уничтожать Jpg1 кто будет? А нахрена ты ещё раз создал bmp1? Ну и про try finally почитай.

ЗЫ. Если программа как-то работает, это совсем не означает, что она работает правильно.



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

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

Наверх




Память: 0.48 MB
Время: 0.061 c
15-1350648132
toto
2012-10-19 16:02
2013.03.22
C# GridView


15-1263085307
McSimm
2010-01-10 04:01
2013.03.22
(2) Кто знает, что-то похожее, но новое?


6-1256728864
Usov
2009-10-28 14:21
2013.03.22
Проблема с логином на сайте (Indy)


15-1346754559
<zzz>
2012-09-04 14:29
2013.03.22
сборка программы из командной строки


15-1343817068
ProgRAMmer Dimonych
2012-08-01 14:31
2013.03.22
Spurious wakeup в WinSock?