Здравствуйте, делаю лабу, нужно наложить одно изображение на другое, для этого используется 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;