CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Obrót zdjęć

Obrót zdjęć

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Obrót zdjęć

Nowy postprzez Minister » wtorek, 26 października 2010, 21:47

Witam.
Mam problem. Robię programik. Wczytuję do niego zdjęcia w formacie BMP i JPG, ale częściej JPG - tak więc skupiam się tylko na tym formacie. Lądują one w Image1. Chcę te zdjęcia obrócić o 90/180 stopni, by się pojawiły w Image1 a potem by się dało je zapisać do pliku w formacie wejściowym (JPG).
Sprawdzałem portal, jest to w bibliotece gdiplus.lib, ale tamten artykuł dotyczy plików png, a mi tutaj potrzeba JPG.
Prosze o pomoc.
Avatar użytkownika
Minister
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): wtorek, 24 sierpnia 2010, 20:18
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox

Obracanie grafiki z wykorzystaniem GDI+ (gdiplus)

Nowy postprzez Cyfrowy Baron » środa, 27 października 2010, 10:10

► patrz serwis: Cyfrowy Baron dział: porady -> grafika -> Wyświetlanie grafiki z wykorzystaniem biblioteki gdiplus.dll GDI+.

Sprawdzałem portal, jest to w bibliotece gdiplus.lib, ale tamten artykuł dotyczy plików png, a mi tutaj potrzeba JPG.


Czyli przejrzałeś kod, ale nic z niego nie zrozumiałeś. :shock:

Nie ma znaczenia na jakim formacie pliku pracujesz, gdyż używasz klas Gdiplus::Image i Gdiplus::Graphics, więc przy wczytywaniu i wykonywaniu operacji na grafice nie musisz martwić się o format pliku, ponieważ klasa Gdiplus dokona niezbędnej konwersji. Przy zapisywaniu wystarczy zaś wybrać format w jakim chcesz zapisać plik.

Niżej przedstawiam kompletny kod programu, który wczytuje grafikę w pięciu formatach, wykonuje na niej obrót i zapisuje do wybranego formatu. Kod dla środowiska C++Builder 2010, więc konwersje z AnsiString do wchat_t będziesz musiał sobie pozmieniać, gdyż w C++Builder 2007 jest trochę inaczej, ale przykłady masz w podanym wyżej linku.


Plik nagłówkowy Unit1.h
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>

#include <gdiplus.h>
#include <Dialogs.hpp>
#include <ExtDlgs.hpp>
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TImage *Image1;
        TButton *LoadButton;
        TButton *RotateButton;
        TButton *SaveButton;
        TOpenPictureDialog *OpenPictureDialog1;
        TSaveDialog *SaveDialog1;
        void __fastcall FormDestroy(TObject *Sender);
        void __fastcall LoadButtonClick(TObject *Sender);
        void __fastcall RotateButtonClick(TObject *Sender);
        void __fastcall FormResize(TObject *Sender);
        void __fastcall SaveButtonClick(TObject *Sender);
private:        // User declarations
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;

        Gdiplus::Image *imageFile;

        void __fastcall ClearImageCanvas(TImage *Image);
        void __fastcall ViewImage(void);
        void __fastcall RotateImage(Gdiplus::RotateFlipType rfT);
        void __fastcall SaveImageToFile(String fileName, String Ext);

public:         // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Plik źródłowy Unit1.cpp
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
#define STRICT

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "gdiplus.lib"

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
 unsigned int num = 0;
 unsigned int size = 0;

 Gdiplus::GetImageEncodersSize(&num, &size);
 if(size == 0)return -1;

 Gdiplus::ImageCodecInfo* imageCodecInfo = new Gdiplus::ImageCodecInfo[size];
 Gdiplus::GetImageEncoders(num, size, imageCodecInfo);

 for(unsigned int i = 0; i < num; ++i)
 {
  if(wcscmp(imageCodecInfo[i].MimeType, format) == 0)
  {
   *pClsid = imageCodecInfo[i].Clsid;
   delete[] imageCodecInfo;
   return i;
  }
 }
 delete[] imageCodecInfo;
 return -1;
}

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 imageFile = new Gdiplus::Image(L"");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 ClearImageCanvas(Image1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
 delete imageFile;
 Gdiplus::GdiplusShutdown(gdiplusToken);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClearImageCanvas(TImage *Image)
{
  Image1->Picture = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ViewImage(void)
{
 ClearImageCanvas(Image1);

 Gdiplus::Graphics grphxPNG(Image1->Canvas->Handle);
 grphxPNG.DrawImage(imageFile, 0, 0, imageFile->GetWidth(), imageFile->GetHeight());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RotateImage(Gdiplus::RotateFlipType rfT)
{
 if(imageFile == NULL)
 {
  Application->MessageBox(L"Nie wczytano obrazka!", Application->Title.c_str(),
                          MB_OK | MB_ICONSTOP);
  return;
 }

 ClearImageCanvas(Image1);

 imageFile->RotateFlip(rfT);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveImageToFile(String fileName, String Ext)
{
 CLSID fileClsid;
 GetEncoderClsid(Ext.c_str(), &fileClsid);
 Caption = fileName + "     " + Ext;
 imageFile->Save(fileName.c_str(), &fileClsid, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadButtonClick(TObject *Sender)
{
 if(OpenPictureDialog1->Execute())
 {
  delete imageFile;
  imageFile = new Gdiplus::Image( OpenPictureDialog1->FileName.c_str(), false);
  ViewImage();
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RotateButtonClick(TObject *Sender)
{
 RotateImage(Gdiplus::Rotate90FlipNone);
 ViewImage();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveButtonClick(TObject *Sender)
{
 /* ustwienie dmoyślnego rozszerzenia jest niezbędna w przeciwnym razie
    pliki będą zapisywane bez rozszerzenia. Można je również ustawić w
    Object Inspector na zakłądce properties dla SaveDialog, zamiast w kodzie */

 SaveDialog1->DefaultExt = "jpg";

 SaveDialog1->FileName = "";

 if(SaveDialog1->Execute())
 {
  String Ext;
  switch( SaveDialog1->FilterIndex )
  {
   case 1: Ext = "image/gif"; break;
   case 2: Ext = "image/png"; break;
   case 3: Ext = "image/jpeg"; break;
   case 4: Ext = "image/bmp"; break;
   case 5: Ext = "image/tiff"; break;

   default: Ext = "image/jpeg";
  }

  SaveImageToFile(SaveDialog1->FileName, Ext);
 }
}
//---------------------------------------------------------------------------




Układ filtrów w obiektach OpenPictureDialog1 i SaveDialog1:

filtry.png


W załączniku kod źródłowy z programem.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Obrót zdjęć

Nowy postprzez kwgrkwgr » środa, 11 maja 2011, 23:21

Chciałem zadać takie właśnie pytanie lecz znalazłem już odpowiedź i plik projektu. Moje pytanie wiec będzie takie:
Ten kod jest pod BuilderC++2010 czy da się to samo zrobić w BuilderC++6? Czy on już jest za stary.

Czy to jest cała lista plików graficznych które można wczytać do Timage? Czy może są jeszcze inne formaty? Np: JPEG2000?
http://galfar.vevb.net/wp/projects/jpeg2000-for-pascal/ Coś takiego pod Delphi jest a pod C++?
http://www.delphipages.com/comp/jpeg_20 ... 11371.html
Czy jest możliwość wczytanie pliku PDF składającego się z obrazów graficznych? 1 strona pliku PDF do Timage joko obrazek?
http://en.pudn.com/downloads67/sourceco ... 24_en.html
KOD cpp:     UKRYJ  
   case 1: Ext = "image/gif"; break;
    case 2: Ext = "image/png"; break;
    case 3: Ext = "image/jpeg"; break;
    case 4: Ext = "image/bmp"; break;
    case 5: Ext = "image/tiff"; break;
Dzięki za wyjaśnienie.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
kwgrkwgr
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 13 kwietnia 2011, 16:37
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: WinXP Win7
Kompilator: C++ Builder 6;
C++ Builder 2010;
MS Visual 2008 C#;
Gadu Gadu: 9692051
    Windows XPOpera

Re: Obrót zdjęć

Nowy postprzez Cyfrowy Baron » czwartek, 12 maja 2011, 17:48

kwgrkwgr napisał(a):Ten kod jest pod BuilderC++2010 czy da się to samo zrobić w BuilderC++6? Czy on już jest za stary.


A o który kod chodzi?!?



kwgrkwgr napisał(a):Czy to jest cała lista plików graficznych które można wczytać do Timage? Czy może są jeszcze inne formaty? Np: JPEG2000?


Biblioteka TImage obsługuje standardowo tylko format BMP. Ponieważ do środowiska dołączona jest biblioteka JPEG.hpp, to możliwe jest również obsługiwanie formatu JPG. Jeżeli zainstalujesz sobie pakiet komponentów LMD Special Tools, to będziesz miał dodatkowo GIF (ale nie animowany), PN, TIFF. I to w zasadzie wszystko. Jeżeli chcesz obsługiwać inne formaty to potrzebujesz dodatkowych bibliotek do tych formatów zgodnych z Twoim środowiskiem.
Jeżeli skorzystasz z GDI+, zamiast standardowego GDI, to możesz w TImage i w innych obiektach dziedziczących po klasie TWinControl, wyświetlać formaty obsługiwane przez GDI+, czyli BMP, JPG, GIF, PNG, TIFF. Jednak musisz wiedzieć, że GDI+ jest mniej wydajne od standardowego GDI, gdyż nie korzysta ze wsparcia sprzętowego. ► patrz serwis: Cyfrowy Baron dział: porady -> grafika ->Wyświetlanie grafiki z wykorzystaniem biblioteki gdiplus.dll GDI+.

Co się tyczy formatu JPEG2000, to jeszcze nie spotkałem się z biblioteką do obsługi tegoż formatu, zgodną ze środowiskiem C++Builder.



kwgrkwgr napisał(a):Czy jest możliwość wczytanie pliku PDF składającego się z obrazów graficznych? 1 strona pliku PDF do Timage joko obrazek?


Standardowo nie jest to możliwe i nie wydaje mi się by kiedykolwiek mogło być to możliwe z wykorzystaniem TImage. Tutaj potrzebna jest bardziej rozbudowana biblioteka.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości

cron