
17.09.2012, 18:13
|
 |
Профессионал
|
|
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
|
|
Цитата:
Сообщение от Fredwriter
Здравствуйте, делаю лабу, нужно наложить одно изображение на другое, для этого используется Alpha-наложение при помощи API AlphaBlend. Если выбирается jpg, то я преобразую jpg в bmp и пытаюсь наложить. Если оба выбранных изображения bmp, или оба jpg, то всё накладывается отлично, если одно jpg, а другое bmp, то GetLastError с кодом 87(неверно задан параметр). Понятно, что я как-то недопреобразовал jpg, но информации о том, как правильно сделать не нашел.
Может найдется добрый дядя, который мне поможет?
|
По мотивам твоей процедуры  (пришлось переделать почти всё):
Код:
procedure TForm1.Button1Click(Sender: TObject);
function GetBitmap(const FileName: string): TBitmap;
var
ext: string;
bmp: TBitmap;
jpg: TJPEGImage;
begin
Result := nil;
ext := AnsiLowerCase(ExtractFileExt(FileName));
if ext = '.bmp' then
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile(FileName);
Result := bmp;
bmp := nil;
finally
bmp.Free;
end;
end else
if (ext = '.jpg') or (ext = '.jpeg') then
begin
jpg := TJPEGImage.Create;
try
jpg.LoadFromFile(FileName);
bmp := TBitmap.Create;
try
bmp.Assign(jpg);
Result := bmp;
bmp := nil;
finally
bmp.Free;
end;
finally
jpg.Free;
end;
end else
begin
raise Exception.Create('Неизвестное расширение у файла: "' + FileName + '"');
end;
end;
var
bmp1, bmp2: TBitmap;
Blend: TBlendFunction;
err: DWORD;
begin
try
bmp1 := GetBitmap(Edit1.Text);
try
bmp2 := GetBitmap(Edit2.Text);
try
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
begin
Image1.Canvas.Draw(0, 0, bmp1);
// или так:
// Image1.Picture.Assign(bmp1);
end else
begin
err:=GetLastError;
MessageDlg('Ошибка №'+IntToStr(err)+': "'+SysErrorMessage(err)+'"',
mtError, [mbOK], 0);
end;
finally
bmp2.Free;
end;
finally
bmp1.Free;
end;
except
on E: Exception do
begin
MessageDlg('Возникло исключение класса "'+E.ClassName+'", с сообщением "'+
E.Message+'"', mtError, [mbOk], 0 );
end;
end;
end;
|