Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с JPEG


Автор: Лена 18.2.2009, 14:48
Как картинки jpeg наложить поверх друг друга и сохранить в отдельный файл. В архиве три картинки.
2 картинки которые надо наложить, а в третьей результат. Как это можно реализовать?

Начала так:
Код

#include <memory>
#include "jpeg.hpp"
using namespace std;

//****************
  AnsiString Path = ExtractFilePath(Application->ExeName);
  Path = Path + "myfiles\\1.jpeg";

    if(FileExists(Path))
        {
         //большая картинка всегда 256 на 256 пикселей
         auto_ptr <TJPEGImage> er(new TJPEGImage());
         er->LoadFromFile("myfiles\\1.jpeg");
         //маркер
         auto_ptr <TJPEGImage> er2(new TJPEGImage());
         er2->LoadFromFile("myfiles\\2.jpeg");

                                //а как теперь объединить и сохранить результат?
        }
        else
           {
           //           
          }


Автор: Dmi3ev 18.2.2009, 15:12
я так понял одну надо на другой нарисовать, а потом все это сохранить, для наглядности использовал Image, но можно и без него это все провернуть
Код

#include <jpeg.hpp>
//...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap *bm=new Graphics::TBitmap;
TJPEGImage* ji=new TJPEGImage;
ji->LoadFromFile("D:\\N70_5.jpg");
bm->Assign(ji);
Image1->Picture->Bitmap=bm;
ji->LoadFromFile("D:\\N70_5.jpg");
bm->Assign(ji);
Image1->Picture->Bitmap->Canvas->Draw(300,300,bm);
Image1->Picture->SaveToFile("D:\\22.bmp");
}


Добавлено через 1 минуту и 5 секунд
использовал одну и туже картинку для наглядности... чтобы видно было смещение...

Автор: Лена 18.2.2009, 15:17
Спасибо за помощь.
Мне результирующая картинка нужна в формате jpeg и я не могу использовать компонеты типа Image. 
Это код на сервере для web интерфейса...
Мне надо получить картику и потом отправить ее пользователю.

Автор: mrbrooks 18.2.2009, 15:22
Лена, дык собственно не сложно конвертнуть из bmp в jpeg.

Автор: Alca 18.2.2009, 15:23
Цитата

я не могу использовать компонеты типа Image

Чего низя?

Автор: Лена 18.2.2009, 15:27
Цитата(Alca @  18.2.2009,  15:23 Найти цитируемый пост)
Чего низя? 



Цитата(Лена @  18.2.2009,  15:17 Найти цитируемый пост)
Это код на сервере 


WAP интерфейс.

Автор: Dmi3ev 18.2.2009, 15:29
хорошо, подробно, суть та же...
Код

#include <jpeg.hpp>
//...
void __fastcall TForm1::Button1Click(TObject *Sender)
{

Graphics::TBitmap *bm=new Graphics::TBitmap;
Graphics::TBitmap *temp=new Graphics::TBitmap;

TJPEGImage* ji1=new TJPEGImage;
TJPEGImage* ji2=new TJPEGImage;

ji1->LoadFromFile("D:\\N70_5.jpg");
ji2->LoadFromFile("D:\\N70_5.jpg");

bm->Assign(ji1);
temp->Assign(ji2);
bm->Canvas->Draw(500, 500, temp);

ji1->Assign(bm);
ji1->SaveToFile("D:\\22.jpg");
}
//---------------------------------------------------------------------------

Автор: Лена 18.2.2009, 15:30
Цитата(Alca @  18.2.2009,  15:23 Найти цитируемый пост)
ji->SaveToFile(".....");


Ну да так и будет в конце, но там же должна быть объедененная картинка (как в архиве).

Добавлено через 2 минуты и 4 секунды
Цитата(Dmi3ev @  18.2.2009,  15:29 Найти цитируемый пост)
хорошо, подробно, суть та же...


Спасибо, сейчас попробую. 

P.S.
А вторая картинка разве будет строго по центру?

Автор: Dmi3ev 18.2.2009, 15:34
Цитата

Ну да так и будет в конце, но там же должна быть объедененная картинка (как в архиве).

так и есть...

Автор: mrbrooks 18.2.2009, 15:39
Цитата(Лена @  18.2.2009,  15:30 Найти цитируемый пост)
P.S.
А вторая картинка разве будет строго по центру?

я что то в этом сомневаюсь.  smile 

Автор: Dmi3ev 18.2.2009, 15:40
Цитата

А вторая картинка разве будет строго по центру?

с координатами сама разберешься, это не сложно, если у тебя 256 на 256, то центр 128, 128, учитывая что вторая картинка, допустим 20х20, начинаем с 118, 118, так примерно, чтобы по центру было...
вот тут указываешь эти координаты
Код

bm->Canvas->Draw(500, 500, temp);

я просто показал, как это делать, а красоту наводить у тебя даже лучше получится, ты же из прекрасного пола...

Автор: Alca 18.2.2009, 15:43
Цитата

Цитата(Alca @  18.2.2009,  15:23 )
Чего низя? 


Цитата(Лена @  18.2.2009,  15:17 )
Это код на сервере 


WAP интерфейс.


Код

 :girl_crazy 
//---------------------------------------------------------------------------
void setAsMainForm() {
  TIWForm1::SetAsMainForm();
 }
#pragma startup setAsMainForm
void __fastcall TIWForm1::IWAppFormWAPCreate(TObject *Sender)
{
    TImage *Image1 = new TImage(NULL);


    Graphics::TBitmap *bm=new Graphics::TBitmap;
    TJPEGImage* ji=new TJPEGImage;
    ji->LoadFromFile("D:\\N70_5.jpg");
    bm->Assign(ji);
    Image1->Picture->Bitmap=bm;
    ji->LoadFromFile("D:\\N70_5.jpg");
    bm->Assign(ji);
    Image1->Picture->Bitmap->Canvas->Draw(300,300,bm);
    Image1->Picture->SaveToFile("D:\\22.bmp");

    delete  Image1;
}
//---------------------------------------------------------------------------

Или я чего-то не догоняю? smile 

Автор: mrbrooks 18.2.2009, 15:47
Должно быть что то вроде этого
Код

std::auto_ptr<TJPEGImage>jpeg1(new TJPEGImage);
std::auto_ptr<TJPEGImage>jpeg2(new TJPEGImage);
jpeg1->LoadFromFile("1.jpeg");
jpeg2->LoadFromFile("2.jpeg");
std::auto_ptr<Graphics::TBitmap>bmp1(new Graphics::TBitmap);
std::auto_ptr<Graphics::TBitmap>bmp2(new Graphics::TBitmap);
bmp1->Assign(jpeg1.get());
bmp2->Assign(jpeg2.get());
bmp1->Canvas->CopyRect(TRect(bmp1->Height/2,bmp1->Width/2,bmp1->Height,bmp1->Width),bmp2->Canvas,
                       TRect(0,0,bmp1->Height,bmp1->Width));
jpeg1->Assign(bmp1.get());
jpeg1->SaveToFile("res.jpeg");

Автор: Dmi3ev 18.2.2009, 15:47
Код


Graphics::TBitmap *bm=new Graphics::TBitmap;
Graphics::TBitmap *temp=new Graphics::TBitmap;

TJPEGImage* ji1=new TJPEGImage;
TJPEGImage* ji2=new TJPEGImage;

ji1->LoadFromFile("D:\\1.jpg");
ji2->LoadFromFile("D:\\2.jpg");

bm->Assign(ji1);
temp->Assign(ji2);
bm->Canvas->Draw(118, 117, temp);

ji1->Assign(bm);
ji1->SaveToFile("D:\\res1.jpg");

вот твой автобусик в том же месте, что и в примере у тебя...
все ок...

Автор: mrbrooks 18.2.2009, 15:48
Цитата(Dmi3ev @  18.2.2009,  15:40 Найти цитируемый пост)
Цитата

А вторая картинка разве будет строго по центру?

с координатами сама разберешься, это не сложно, если у тебя 256 на 256, то центр 128, 128, учитывая что вторая картинка, допустим 20х20, начинаем с 118, 118, так примерно, чтобы по центру было...
вот тут указываешь эти координаты
Выделить всёкод C++ Builder
1:
    
bm->Canvas->Draw(500, 500, temp);

я просто показал, как это делать, а красоту наводить у тебя даже лучше получится, ты же из прекрасного пола...

совершенно с вами согласен  smile

Добавлено через 36 секунд
Цитата(Dmi3ev @  18.2.2009,  15:47 Найти цитируемый пост)
вот твой автобусик в том же месте, что и в примере у тебя...
все ок... 

с этим тоже

Автор: Dem_max 18.2.2009, 15:51
Держи
Код

Graphics::TBitmap *bm=new Graphics::TBitmap;
TJPEGImage* ji=new TJPEGImage;
ji->LoadFromFile("1.jpg");
bm->Assign(ji);
ji->LoadFromFile("2.jpg");
bm->Canvas->Draw(10,10, ji);
ji->Assign(bm);
ji->SaveToFile("3.jpg");

Автор: Dmi3ev 18.2.2009, 15:51
mrbrooks, да для общего случая надо так...
или можно вот так примерно
Код


Graphics::TBitmap *bm=new Graphics::TBitmap;
Graphics::TBitmap *temp=new Graphics::TBitmap;

TJPEGImage* ji1=new TJPEGImage;
TJPEGImage* ji2=new TJPEGImage;

ji1->LoadFromFile("D:\\1.jpg");
ji2->LoadFromFile("D:\\2.jpg");

bm->Assign(ji1);
temp->Assign(ji2);
bm->Canvas->Draw( (bm->Width/2)-(temp->Width/2),(bm->Height/2-temp->Height/2), temp);

ji1->Assign(bm);
ji1->SaveToFile("D:\\res2.jpg");

тоже пойдет...

Автор: mrbrooks 18.2.2009, 16:01
Dmi3ev, и снова согласен. Только Height это по оси Y, Width по оси X - грубо говоря. Надо местами поменять - а так все вер гуд.

Добавлено через 1 минуту и 30 секунд
Код

bm->Canvas->Draw(bm->Width/2 - temp->Width/2,bm->Height/2 - temp->Height/2 , temp);

Автор: Dmi3ev 18.2.2009, 16:04
Цитата

Только Height это по оси Y, Width по оси X - грубо говоря.

это да, я просто тут написал, протупил, исправил....

Автор: Alca 18.2.2009, 16:12
Парни вы увлеклись  smile 

Автор: Dmi3ev 18.2.2009, 16:16
Цитата

Парни вы увлеклись  smile  

а почему бы Лёське не помочь? Лёське помочь - хорошее дело...

Автор: Лена 18.2.2009, 16:18
Спасибо!
Ну ребята у вас и скрость!
Я с этими джипегами второй день мучаюсь! smile 

Автор: Лена 20.2.2009, 12:24
Вот проблемка...
А как быть если картинка на которую надо поставить маркер имеет формат PNG?
Картинка номер 2 это картинка моего маркера я ее делаю сама, поэтому формат может быть любой (jpeg, png, gif, bmp), а вот картинка номер 1 теперь имеет формат PNG. 
Как тогда поступить?

Автор: mrbrooks 20.2.2009, 12:59
использовать класс TPngImage из <pngimage.hpp>  smile  дальше все по аналогии с jpeg

Автор: Лена 20.2.2009, 13:38
Цитата(mrbrooks @  20.2.2009,  12:59 Найти цитируемый пост)
использовать класс TPngImage из <pngimage.hpp>


Наверное это для RAD 2009, а у меня 2007.
Файлик не нашла...

Автор: Alca 20.2.2009, 13:52
Цитата

Наверное это для RAD 2009, а у меня 2007.

 smile 
Ищи компонету для PNG.

Автор: mrbrooks 20.2.2009, 14:04
Цитата(Лена @  20.2.2009,  13:38 Найти цитируемый пост)
Наверное это для RAD 2009

да я привел пример из RAD 2009. 

хм. а посмотри класс TPicture может работать с png или что то типа этого. Иначе прийдется искать либо компонент, либо либу для работы с png d 2007

Добавлено через 4 минуты и 16 секунд
Лена, попробуй ImageEn v3.0 - должна помочь  smile  за подробностями в личку  smile 

Автор: Лена 20.2.2009, 14:53
Цитата(mrbrooks @  20.2.2009,  14:04 Найти цитируемый пост)
попробуй ImageEn v3.0


Вы забыли, что я создаю wap интерфейс на основе wap компонетов IntraWEB, поэтому сторонние компонеты в проекте wap работать не будут. smile 

Автор: Alca 20.2.2009, 15:25
http://ru.wikipedia.org/wiki/Libpng
http://ru.wikipedia.org/wiki/FreeImage

Автор: Лена 20.2.2009, 18:00
А через ScaneLine такое можно реализовать?

P.S.
Говорят эта штука поможет. Это то, что в 2009.
Буду пробывать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)