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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.066 c
2-1336248923
rodionov-uv
2012-05-06 00:15
2013.03.22
Документ Word и Delphi


2-1336066310
igorium
2012-05-03 21:31
2013.03.22
Не отображаются русские буквы в английских Виндовс


15-1343378205
Phoenix_
2012-07-27 12:36
2013.03.22
Delphi -> Java/Android


2-1329678422
Zheksonz
2012-02-19 23:07
2013.03.22
Почему на панели TCategoryPanelGroup не виден TLabel?


2-1333615982
webpauk
2012-04-05 12:53
2013.03.22
передача в процедуру массива





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