Главная страница
    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.111 c
15-1331988168
Дмитрий С
2012-03-17 16:42
2013.03.22
Задачу подкинули интересную


15-1344959281
Рекрут
2012-08-14 19:48
2013.03.22
Что должен уметь сисадмин?


2-1337101522
опшипка
2012-05-15 21:05
2013.03.22
опшипка


15-1351590930
Palladin
2012-10-30 13:55
2013.03.22
Как в директивах препроцессора с# target framework учесть?


3-1277120776
Раиса
2010-06-21 15:46
2013.03.22
MySQL и внешние ключи





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