Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2012, 16:09   #1
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию 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;
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 17.09.2012, 18:31   #2
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Можно переместить мою тему в какой нибудь более подходящий раздел, так как здесь она как то непопулярна?
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 17.09.2012, 19:28   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  bmp1, bmp2: TBitMap;
  jpg1, jpg2: TJpegImage;
  Blend: TBlendFunction;
  s1, s2: string;
begin
  try
    jpg1 := TJpegImage.Create;
    jpg2 := TJpegImage.Create;
    bmp1 := TBitMap.Create;
    bmp2 := TBitMap.Create;
    try
      s1 := AnsiLowerCase(ExtractFileExt(Edit1.text));
      s2 := AnsiLowerCase(ExtractFileExt(Edit2.text));
      if (s1 = '.jpg') or (s1 = '.jpeg') then
      begin
        jpg1.LoadFromFile(Edit1.text);
        bmp1.Assign(jpg1);
      end
      else if s1 = '.bmp' then
      begin
        bmp1.LoadFromFile(Edit1.text);
      end;
      if (s2 = '.jpg') or (s2 = '.jpeg') then
      begin
        jpg2.LoadFromFile(Edit2.text);
        bmp2.Assign(jpg2);
      end
      else if s2 = '.bmp' then
      begin
        bmp2.LoadFromFile(Edit2.text);
      end;
      Blend.SourceConstantAlpha := ScrollBar1.Position;
      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));
    except
      showmessage
        ('Не удалось выполнить наложение, проверьте правильность путей' + #10#13 + 'для выбранных изображений');
    end;
  finally
    bmp1.Free;
    bmp2.Free;
    jpg1.Free;
    jpg2.Free;
  end;
end;
Работает (у меня).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.09.2012 в 19:53.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наложить BMP на BMP. sergeyrulit Общие вопросы Delphi 6 05.03.2015 13:41
Конвертер из png в jpg или gif или bmp Квэнди Мультимедиа в Delphi 8 04.10.2011 22:26
как получить цвет пикселя из картинки jpg,не конвертируя в bmp?? Dima_Dima Общие вопросы Delphi 3 27.05.2010 10:49
Проблема преобразование jpg в bmp через dll inndim Общие вопросы Delphi 5 24.06.2008 18:24
Помогите плз с bmp и jpg Svetik Общие вопросы C/C++ 4 27.11.2007 19:00