Конференция "Media" » склеивание изображения [D7, WinXP]
 
  • Незнайка (31.03.08 01:27) [0]
    У меня есть два изображения. Задача следующая, нужно пристыковать к первому изображению справа или с низу второе изображение и сохранить результат. Размеры изображений одинаковые. Подскажите, как это можно сделать?

    Заранее спасибо.
  • {RASkov} © (31.03.08 02:45) [1]
    > [0] Незнайка   (31.03.08 01:27)

    два изображения - это два холста? Это имелось в виду?... т.е. Канва Битмапов например....
    Создать "третье изображение" установив ему нужные размеры, ну и методы холстов или работа с холстом: CopyRect например, или Draw.... также есть BitBlt - тоже может помочь...
  • Незнайка (31.03.08 21:17) [2]
    Итак, в Image1 поместил первое изображение, в Image2 второе
    размер изображений 100х100.

    var
     bmp1, bmp2, bmp3: TBitmap;
    begin
     //загрузить исходное изображение
     image1.Picture.LoadFromFile('C:\1.bmp');
     image2.Picture.LoadFromFile('C:\1a.bmp');

     bmp1 := TBitmap.Create;
     bmp2 := TBitmap.Create;
     bmp3 := TBitmap.Create;

     bmp1.Assign(image1.Picture);
     bmp2.Assign(image1.Picture);
     bmp3.Assign(bmp1);            
     BitBlt(bmp3.Canvas.Handle, 100, 0, 100, 100,
             bmp2.Canvas.Handle, 0, 0, SRCCOPY);

     bmp3.SaveToFile('C:\3.bmp'); // сохраняем результат на диск
     image2.Picture.LoadFromFile('C:\3.bmp');
     bmp1.Free; bmp2.Free; bmp3.Free;
    end;

    но ничего не происходит

    если в  BitBlt по координате х поставит 50

    BitBlt(bmp3.Canvas.Handle, 50, 0, 100, 100, bmp2.Canvas.Handle, 0, 0, SRCCOPY);

    то все работает, но первое изображение и второе усечено на половину. Т.е. при выполнении

    bmp3.Assign(bmp1);

    Canvas задается размером 100х100 и поэтому за его приделами ничего не рисуется. Как изменить (увеличить)  размеры Canvas?
  • Незнайка (31.03.08 21:38) [3]
    вопрос снят :)

    Простое использование Width и Height

    {RASkov} Спасибо за подсказку
  • {RASkov} © (31.03.08 23:18) [4]
    > [3] Незнайка   (31.03.08 21:38)
    > {RASkov} Спасибо за подсказку

    Спасибо-то... спасибо.... т.е. пожалуйста, но только вот в [2] ужас какой-то :) Я не так подсказывал )
    В прочем не то что бы ужас, но имеется лишнее....
    Временного битмапа достаточно одного...
  • Незнайка (01.04.08 00:37) [5]
    Ага, понял, лишнее убрал :)
  • {RASkov} © (01.04.08 08:27) [6]
    > [5] Незнайка   (01.04.08 00:37)
    > Ага, понял, лишнее убрал

    Да, но кое чего не хватает в коде :) Смотри, если вдруг например строка:
    > bmp3.SaveToFile('C:\3.bmp'); // сохраняем результат на диск
    вызовет исключение, то что будет? Точно, утёк битмап...:(
    :о)
  • antonn © (01.04.08 08:49) [7]
    и тут я подскажу и всех спасу %)
    try..finally
  • Незнайка (02.04.08 03:12) [8]
    с форматом bmp код работает на ура, а вто с jpg выдает ошибку на строке

    bmp1.Assign(image1.Picture);

    говорит что типы  TPicture и TBitmap несовместимы. Ну это и понятно, мы создали класс TBitmap.
    А как работать с jpg?
  • {RASkov} © (02.04.08 10:46) [9]
    > [8] Незнайка   (02.04.08 03:12)
    > А как работать с jpg?

    Для этих нужно
    uses ...., Jpeg;

    ну и TJPEGImage;
    Но тебе нужно все равно делать через временный bmp....

    var
    BMP: TBitmap; JPG: TJPEGImage;
    begin
    //загрузить исходное изображение
    image1.Picture.LoadFromFile('C:\1.bmp');
    image2.Picture.LoadFromFile('C:\1a.bmp');

    bmp := TBitmap.Create;
    try
     bmp.width:=image1.Picture.bitmap.width;
     bmp.height:=image1.Picture.bitmap.heigth+image2.Picture.bitmap.height;
     bmp.Canvas.Draw(0,0,image1.Picture.bitmap);
     bmp.Canvas.Draw(0,image1.Picture.bitmap.heigth, image2.Picture.bitmap);
     JPG:=TJPEGImage.create;
     try
      JPG.Assign(BMP);
      JPG.SaveToFile('C:\3.jpg'); // сохраняем результат на диск
     finally
      jpg.Free;
     end;
    finally
     bmp.Free;
    end;
    end;


    Если у тебя исходные файлы "джепеги", то переделай чуток код....
  • Незнайка (02.04.08 17:37) [10]
    вот если исходник джепеги то ничего не выходит

    image1.Picture.LoadFromFile('C:\1.jpg');
    image2.Picture.LoadFromFile('C:\1a.jpg');
    bmp := TBitmap.Create;
    ...
    bmp.width:=image1.Picture.bitmap.width;
    bmp.height:=image1.Picture.bitmap.heigth+image2.Picture.bitmap.height;
    bmp.Canvas.Draw(0,0,image1.Picture.bitmap);
    ...



    bmp.Canvas.Draw(0,0,image1.Picture.bitmap); после этого выполнения, стирается изображение в image1 и в bmp ничего не переносится

    т.е. если в Image1 и Image2 хранится не bmp а jpg то ничего не получается
    возможно ли изображение jpg из Image1 взять как bmp?
  • Незнайка (02.04.08 17:51) [11]
    Взял вот такой код с BMP работает как часы, на все 100

    image1.Picture.LoadFromFile('C:\0.bmp');
    image2.Picture.LoadFromFile('C:\0a.bmp');
    image3.Picture.LoadFromFile('C:\0.bmp');
    image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                                             image2.Picture.bitmap.width;
    image3.Picture.Bitmap.Canvas.Draw(image2.Picture.bitmap.width,0,image2.Picture.b itmap);



    Вот такой код тоже самое но JPG уже не работает, изображения выбираются из image1 и image2, в image3 никаких результатов

    image1.Picture.LoadFromFile('C:\0.jpg');
    image2.Picture.LoadFromFile('C:\0a.jpg');
    image3.Picture.LoadFromFile('C:\0.jpg');
    image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                                  image2.Picture.bitmap.width;
    image3.Picture.Bitmap.Canvas.Draw(image2.Picture.bitmap.width,0,image2.Picture.b itmap);



    причем исчезновение изображения пропадает уже после

    image3.Picture.Bitmap.width := image1.Picture.bitmap.width +
                                  image2.Picture.bitmap.width;
  • {RASkov} © (02.04.08 21:33) [12]
    > [11] Незнайка   (02.04.08 17:51)

    uses Jpeg, Math;

    procedure TForm1.Button1Click(Sender: TObject);
    var JPG1, JPG2, JPG_Out: TJPEGImage; BMP: TBitMap;
    begin
      JPG1:=TJPEGImage.Create;
      JPG2:=TJPEGImage.Create;
      try
       JPG1.LoadFromFile('1.jpg');
       JPG2.LoadFromFile('2.jpg');
       BMP:=TBitMap.Create;
       try
        BMP.Width:=Max(JPG1.Width, JPG2.Width);
        BMP.Height:=JPG1.Height+JPG2.Height;
        BMP.Canvas.Draw(0, 0, JPG1);
        BMP.Canvas.Draw(0, JPG1.Height, JPG2);
        JPG_Out:=TJPEGImage.Create;
        try
         JPG_Out.Assign(BMP);
         JPG_Out.SaveToFile('3.jpg');
        finally
         JPG_Out.Free;
        end;
       finally
        BMP.Free;
       end;
      finally
       JPG1.Free; JPG2.Free;
      end;
    end;

  • {RASkov} © (02.04.08 21:45) [13]
    > [10] Незнайка   (02.04.08 17:37)
    > bmp.Canvas.Draw(0,0,image1.Picture.bitmap); после этого
    > выполнения, стирается изображение в image1 и в bmp ничего
    > не переносится

    Потому как в TGraphic(image1.Picture.bitmap) ничего нет мы ж не битмап загрузили, верно?
    Кстати.... попробуй так:
    bmp.Canvas.Draw(0,0,image1.Picture.graphic);

    ;)

    > [11] Незнайка   (02.04.08 17:51) вторая часть

    Тоже самое... ты ж к битмапу тыркаешься, а в контейнере jpeg... Удачи)
  • Незнайка (02.04.08 23:13) [14]
    Класс, все работает, спасибо!!!
 
Конференция "Media" » склеивание изображения [D7, WinXP]
Есть новые Нет новых   [133929   +472][b:0][p:0.002]