![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AlphaBlend: наложить bmp на jpg или наоборот [D7, XP]
fredwriter © (2012-09-17 16:58:00)Здравствуйте, делаю лабу, нужно наложить одно изображение на другое, для этого используется 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;
брат Птибурдукова (2012-09-18 09:55:00) [1]
> 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 почитай.
ЗЫ. Если программа как-то работает, это совсем не означает, что она работает правильно.
antonn (2012-09-17 17:52:00) [2]
> 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;