Показать сообщение отдельно
  #1  
Старый 17.09.2012, 17:24
Fredwriter Fredwriter вне форума
Прохожий
 
Регистрация: 14.11.2010
Сообщения: 9
Репутация: 10
По умолчанию AlphaBlend: наложить bmp на jpg или наоборот

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