Главная страница
    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.46 MB
Время: 0.061 c
15-1351562934
Вепрь
2012-10-30 06:08
2013.03.22
UUID Компьютера.


15-1341404995
alexdn
2012-07-04 16:29
2013.03.22
Главное меню Joomla


15-1330664086
CleriC
2012-03-02 08:54
2013.03.22
HotKey в среде Delphi (не могу назначить)


15-1335604943
Цукор5
2012-04-28 13:22
2013.03.22
Сортировка изображений по "содержимому"


4-1261315823
GreyWolf
2009-12-20 16:30
2013.03.22
Установка Windows Caption Icons Size локально для приложения





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