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


Автор: Melevir 7.7.2009, 06:53
Есть стандартный метод сохранения в bmp,  а надо в jpeg. Посоветуйте что нибудь пожалуйста.. 

Автор: Alexeis 7.7.2009, 09:49
  1) Конвертировать файл после сохранения.
  2) Захватываем картинку сами, TCanvas(GetDC(TChart->Handle)). С этого канаваса копируем на TBitmap c него в TJpegImage -> SaveToFile
  3) Покупаем pro версию этого самого TeeChart, где уже есть сохранение в разные форматы.

Автор: Melevir 7.7.2009, 18:02
Пишу
Код

  Graphics::TBitmap* a = new Graphics::TBitmap;
  a = TCanvas(GetDC(Chart1->Handle));

Выдается ошибка
Код

[C++ Error] Unit1.cpp(24): E2285 Could not find a match for 'TCanvas::TCanvas(void *)'

Что это такое, не понимаю...

Автор: Alexeis 7.7.2009, 20:32
Ой прости, так действительно нельзя
Правильно будет так.
Код


#include <Jpeg.hpp>
.....
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TCanvas *Source = new TCanvas();
    Source->Handle = GetDC(Chart1->Handle);
    Graphics::TBitmap *bmp = new Graphics::TBitmap();
    bmp->SetSize(Chart1->ClientWidth, Chart1->ClientHeight);

    RECT src = Chart1->ClientRect;
    RECT dst = {0, 0, Chart1->ClientWidth, Chart1->ClientHeight};
    bmp->Canvas->CopyRect(dst, Source, src);
    TJPEGImage *jpeg = new TJPEGImage();
    jpeg->Assign(bmp);

    jpeg->SaveToFile("c:\\1.jpg");
    jpeg->Free();

    bmp->Free();

    ReleaseDC(Chart1->Handle, Source->Handle);
    Source->Free();
}

Автор: Melevir 7.7.2009, 21:08
Скопировал один-в-один, получил кучу ошибок :(
Вот весь код:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <Jpeg.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TCanvas *Source = new TCanvas();
    Source->Handle = GetDC(Chart1->Handle);
    Graphics::TBitmap *bmp = new Graphics::TBitmap();
    bmp->SetSize(Chart1->ClientWidth, Chart1->ClientHeight);
    RECT src = Chart1->ClientRect;
    RECT dst = {0, 0, Chart1->ClientWidth, Chart1->ClientHeight};
    bmp->Canvas->CopyRect(dst, Source, src);
    TJPEGImage *jpeg = new TJPEGImage();
    jpeg->Assign(bmp);
    jpeg->SaveToFile("c:\\1.jpg");
    jpeg->Free();
    bmp->Free();
    ReleaseDC(Chart1->Handle, Source->Handle);
    Source->Free();
}
//---------------------------------------------------------------------------

Вот ошибки:
Код

  [C++ Error] Unit1.cpp(24): E2316 'SetSize' is not a member of 'TBitmap'
  [C++ Error] Unit1.cpp(26): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(26): E2139 Declaration missing ;
  [C++ Warning] Unit1.cpp(26): W8004 'dst' is assigned a value that is never used
  [C++ Warning] Unit1.cpp(26): W8004 'src' is assigned a value that is never used
  [C++ Warning] Unit1.cpp(26): W8004 'bmp' is assigned a value that is never used
  [C++ Error] Unit1.cpp(26): E2190 Unexpected }
  [C++ Error] Unit1.cpp(27): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(29): E2238 Multiple declaration for 'jpeg'
  [C++ Error] Unit1.cpp(28): E2344 Earlier declaration of 'jpeg'
  [C++ Error] Unit1.cpp(29): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(30): E2238 Multiple declaration for 'jpeg'
  [C++ Error] Unit1.cpp(29): E2344 Earlier declaration of 'jpeg'
  [C++ Error] Unit1.cpp(30): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(31): E2238 Multiple declaration for 'jpeg'
  [C++ Error] Unit1.cpp(30): E2344 Earlier declaration of 'jpeg'
  [C++ Error] Unit1.cpp(31): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(32): E2238 Multiple declaration for 'bmp'
  [C++ Error] Unit1.cpp(27): E2344 Earlier declaration of 'bmp'
  [C++ Error] Unit1.cpp(32): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(33): E2303 Type name expected
  [C++ Error] Unit1.cpp(33): E2356 Type mismatch in redeclaration of '__stdcall ReleaseDC(void *,void *)'
  [C++ Error] winuser.h(6412): E2344 Earlier declaration of '__stdcall ReleaseDC(void *,void *)'
  [C++ Error] Unit1.cpp(33): E2063 Illegal initialization
  [C++ Error] Unit1.cpp(33): E2293 ) expected
  [C++ Error] Unit1.cpp(34): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(35): E2190 Unexpected }

Пробовал вместо Graphics::TBitmap использовать Windows::TBitmap, без толку...

Автор: mrbrooks 8.7.2009, 08:28
Melevir, как бэ следи за логикой то Alexeis - попробуй так:
Код

#include <Jpeg.hpp>
#include <memory>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    std::auto_ptr<TCanvas>Source(new TCanvas);
    Source->Handle = GetDC(Chart1->Handle);
    std::auto_ptr<Graphics::TBitmap>bmp(new Graphics::TBitmap);
    bmp->Width = Chart1->ClientWidth;
    bmp->Height = Chart1->ClientHeight;
    RECT src = Chart1->ClientRect;
    RECT dst = {0, 0, Chart1->ClientWidth, Chart1->ClientHeight};
    bmp->Canvas->CopyRect(dst, Source.get(), src);
    std::auto_ptr<TJPEGImages>jpeg(new TJPEGImage);
    jpeg->Assign(bmp.get());
    jpeg->SaveToFile("c:\\1.jpg");
    ReleaseDC(Chart1->Handle, Source->Handle);
}

Автор: Alexeis 9.7.2009, 22:22
Melevir, код проверенный. Сохранял, смотрел картинку, все верно. C++ Builder 2007.

Автор: mrbrooks 10.7.2009, 08:02
Alexeis, есть подозрение, что автор юзает С++ Builder 6.

Автор: Alexeis 10.7.2009, 09:29
  Если не работает
Код

bmp->SetSize(Chart1->ClientWidth, Chart1->ClientHeight);


Можно заменить на 

Код

bmp->Height = Chart1->ClientHeight;
bmp->Width  = Chart1->ClientWidth;

Автор: mrbrooks 10.7.2009, 10:59
Цитата(Alexeis @  10.7.2009,  09:29 Найти цитируемый пост)
Можно заменить на 

камрад я собственно это и написал  в своем http://forum.vingrad.ru/forum/topic-265835/anchor-entry1917845/0.html# smile 

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