Конференция "Media" » Как отобразить одну картинку на другой? [D6, WinXP]
 
  • leonidus (30.11.07 00:20) [0]
    Суть проблемы: есть два файла, один это большая картинка скажем 1024 на 768, второй маленькая, скажем 100 на 100. Нужно нарисовать маленькое изображение на большом, ну т.е. "слепить" их. Думал сделать так:

     btm_big:=tbitmap.Create;
     jpg_big:=TJpegImage.Create;
     jpg_big.LoadFromFile(edit1.text);
     btm_big.Assign(jpg_big);

     btm_small:=tbitmap.Create;
     jpg_small:=TJpegImage.Create;
     jpg_small.LoadFromFile(edit2.text);
     btm_small.Assign(jpg_big);

     btm_big.Canvas.Draw(100,100,btm_small);

     jpg_big.Assign(btm_big);
     jpg_big.SaveToFile(edit1.Text+'.jpeg');

    Но что-то ничего не выходит...
  • {RASkov} © (30.11.07 01:16) [1]
    > btm_big.Assign(jpg_big);


    > btm_small.Assign(jpg_big);

    Ты один в один перенес код?

    Вот практически тоже самое, что и у тебя.... только что проверил - работает:

    var Bmp: TBitMap; Jpg: TJPEGImage;
    begin
     Bmp:=TBitMap.Create;
     Jpg:=TJPEGImage.Create;
     try
     if OPD.Execute then begin //OPD - TOpenPictureDialog
      Jpg.LoadFromFile(OPD.FileName);
      Bmp.Assign(Jpg);
     end else Exit;
     if OPD.Execute then begin
      Jpg.LoadFromFile(OPD.FileName);
      Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, Jpg);
     end else Exit;
     Jpg.Assign(Bmp);
     Canvas.Draw(10, 10, Jpg);  //Канва формы
     Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+'1.jpg');
     finally
      Bmp.Free;
      Jpg.Free;
     end;
    end;

  • {RASkov} © (30.11.07 01:27) [2]
    Комментарий к коду в [1]
    "В первом" ОпенДиалоге выбираем фоновую картинку Jpeg формата,
    "Во втором" - выбираем "логотипчик", т.е. маленькую картинку Jpeg формата,
    Затем получившееся "добро" рисуется на форме и сохраняется в файле 1.jpg "рядом" с экзешником...
    "Желательно" что бы фон был на порядок больше чем логотипчик....
    "Логотипчик" отрисовывается в нижнем правом углу "фона".
  • leonidus (30.11.07 13:10) [3]
    {RASkov} большое спасибо, ваш код действительно работает.
    Но тогда вопрос в продолжение. Если картинка прямоугольная то все ок, но мне нужно перед склеиванием маленькую картинку повернуть на некий угол, при этом я получаю прямоугольник с картинкой и соотв. белыми уголками (маленькую картинку я разворачиваю в фотошопе). Но мне они не нужны, а нужно что бы они были прозрачны. Делаю так:

    var
    Bmp: TBitMap; Jpg: TJPEGImage;
    OldBkMode:integer;
    begin
    Bmp:=TBitMap.Create;
    Jpg:=TJPEGImage.Create;
    try
     if OPD.Execute then begin //OPD - TOpenPictureDialog
      Jpg.LoadFromFile(OPD.FileName);
      Bmp.Assign(Jpg);
     end else Exit;

     if OPD.Execute then begin
      Jpg.LoadFromFile(OPD.FileName);
      OldBkMode := SetBkMode(bmp.Canvas.Handle, TRANSPARENT);

      Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, Jpg);
      SetBkMode(bmp.Canvas.Handle, OldBkMode);
     end else Exit;

     Jpg.Assign(Bmp);
     Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+'1.jpg');
    finally
     Bmp.Free;
     Jpg.Free;
    end;

    Но не пашет. Мне так удавалось раньше текст прозрачный размещать, но вот с картинкой затык...
  • {RASkov} © (30.11.07 13:48) [4]
    > [3] leonidus   (30.11.07 13:10)

    Попробуй вот так:
    var Bmp, TmpBmp: TBitMap; Jpg: TJPEGImage;
    begin
     Bmp:=TBitMap.Create;
     Jpg:=TJPEGImage.Create;
     try
      if OPD.Execute then begin //OPD - TOpenPictureDialog
       Jpg.LoadFromFile(OPD.FileName);
       Bmp.Assign(Jpg);
      end else Exit;
      if OPD.Execute then begin
       TmpBmp:=TBitMap.Create;
       try
        Jpg.LoadFromFile(OPD.FileName);
        TmpBmp.Assign(Jpg);
        TmpBmp.TransparentColor:=TmpBmp.Canvas.Pixels[0,0];
        TmpBmp.Transparent:=True;
        Bmp.Canvas.Draw(Bmp.Width-Jpg.Width-10, Bmp.Height-Jpg.Height-10, TmpBmp);
       finally
        TmpBmp.Free;
       end;
      end else Exit;
      Canvas.Draw(10, 35, Bmp);
      Jpg.Assign(Bmp);
      Jpg.SaveToFile(ExtractFilePath(ParamStr(0))+'2.jpg');
     finally
      Bmp.Free;
      Jpg.Free;
     end;
    end;


    Только я не думаю, что это "правильный" вариант.... с транспорентами, поворотами - нужен более профессианальный подход....
    Можно посмотреть в кладовке "демку" от antonn'а. Пример помоему называется Scanline.... Как раз для твоих целей....)
  • {RASkov} © (30.11.07 13:55) [5]
    > [3] leonidus   (30.11.07 13:10)
    > ваш код действительно работает.

    :)
    Это не мой.... это твой код, я просто оформил его "по своему"....
    Сравни с [0] - "один в один" :)
    В [1] было замечание по jpg_big.... т.е. и большой битмап и маленький ассигнились с одним и тем же джепегом....
  • leonidus (30.11.07 14:26) [6]
    Код работает прекрасно. Большое спасибо. А почему вы считает что это не профессиональный подход?
  • {RASkov} © (30.11.07 14:34) [7]
    > [6] leonidus   (30.11.07 14:26)
    > А почему вы считает что это не профессиональный подход?

    Поэксперементируй с разными фонами и разными лого (причем бери обычные джепег картинки, а не подготовленные специально для этого) и ты увидешь "проблему стандартного подхода" к битмапам.....
    хотябы тот же транспарент.... он не будет таким гладким, как хотелось бы
    В общем удачи..... я рад что тебе вполне хватило и кода выше :)
  • leonidus (30.11.07 19:36) [8]
    Я понял уже, буду экспериментировать. Спасибо.
 
Конференция "Media" » Как отобразить одну картинку на другой? [D6, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]