Показать сообщение отдельно
  #2  
Старый 17.09.2012, 18:13
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 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;
Ответить с цитированием