CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - GDI+ i zmiana rozmiaru PNG

GDI+ i zmiana rozmiaru PNG

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » sobota, 23 lipca 2011, 14:03

Dzięki GDI+ w łatwy sposób konwertuję sobie pliki graficzne z dowolnego formatu na PNG. Niestety nie potrafię zmienić rozmiaru pliku PNG na inny konkretny wyrażony w pikselach. Proszę o pomoc :)
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez Cyfrowy Baron » sobota, 23 lipca 2011, 14:22

Przecież masz funkcję DrawImage. Zmiana rozmiaru to przerysowanie obiektu z mniejszej powierzchni na większą:

KOD cpp:     UKRYJ  
Gdiplus::Graphics grphx(Image1->Canvas->Handle);
 String path = ExtractFilePath(ParamStr(0)) + "plik.png";
 Gdiplus::Image image(WideString(path).c_bstr() );
 grphx.DrawImage(&image, 0, 0, /*int nowa_dlugosc, int nowa_wysokosc/* );
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: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » niedziela, 24 lipca 2011, 10:28

Owszem to działa ale powoduje przekonwertowanie grafiki do BMP a co za tym idzie stracenie kanału alpha (w przypadku kiedy zmieniamy rozmiar PNG).
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez polymorphism » niedziela, 24 lipca 2011, 11:21

Tracisz kanał alfa, bo kopiujesz do kontekstu, który tego kanału nie ma. Stąd wniosek prosty, że powinieneś kopiować do innej bitmapy z obsługą tego kanału. Czyli stwórz docelową bitmapę RGBA, stwórz dla niej kontekst (pamięciowy), a dokładniej obiekt klasy Graphics, i za pomocą tego kontekstu przekopiuj bitmapę źródłową do docelowej. Proste :)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » niedziela, 24 lipca 2011, 19:08

Gdyby to było proste to bym nie pisał o tym na forum prawda? ;)
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » niedziela, 24 lipca 2011, 19:37

Ok, poradziłem już sobie. Zamieszczam kod gdyby komuś się przydał:

KOD cpp:     UKRYJ  
void ConvertImage(UnicodeString Old, UnicodeString New)
{
  Gdiplus::Graphics Grphx(Handle);

  Gdiplus::Image OrgImage(Old.w_str());

  Gdiplus::Image* Thumbnail = OrgImage.GetThumbnailImage(16, 16, NULL, NULL);

  Grphx.DrawImage(Thumbnail, 0, 0,Thumbnail->GetWidth(), Thumbnail->GetHeight());

  CLSID gifClsid;

  GetEncoderClsid(L"image/png", &gifClsid);

  Thumbnail->Save(New.w_str(), &gifClsid, NULL);
}
//-----------------------------------------------------------------
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » poniedziałek, 25 lipca 2011, 20:29

Teraz mam nowy problem - w.w. prockę (dodałem tylko usuwanie wskaźnika Thumbnail) używam w pliki DLL i działa bezproblemowo. Niestety podczas wyładowania pliku DLL (po wywołaniu procki) nadal coś wisi w pamięci - GdiplusShutdown tak jakby nie działa?
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez polymorphism » poniedziałek, 25 lipca 2011, 21:18

"Coś" wisieć to sobie może. Nikt nie powiedział, że po wyładowaniu biblioteki wszystkie zasoby są od razu zwalniane. Jeśli wszystko zrobiłeś poprawnie, nie zawracałbym sobie tym głowy (chyba że mowa o nietypowo dużych wyciekach).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » poniedziałek, 25 lipca 2011, 21:33

Gdy nie było przez to problemu to bym nie pisał - niestety gdy po wyładowaniu pliku DLL nie mogę go nadpisać itp. Muszę restartować całą aplikację. Wydaje mi się, że zrobiłem wszystko poprawnie a mimo to, przez GDI+ plik DLL jest niemożliwy do wyładowania.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez polymorphism » poniedziałek, 25 lipca 2011, 21:45

A co zwraca FreeLibrary?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » poniedziałek, 25 lipca 2011, 21:51

To nie jest moja aplikacja więc nie wiem ;) Nawet jak zmodyfikuję prockę gdzie ładuję i kończę sesję GDIPlus to po wyładowaniu pliku DLL plik nie da się nadpisać, jest w użyciu. Dodam, że poniższa procka działa bez problemu, wygląda na to że GdiplusShutdown działa.

KOD cpp:     UKRYJ  
void __fastcall TSettingsForm::ConvertImage(UnicodeString Old, UnicodeString New)
{
  //Inicjalizacja GDIPlus
  Gdiplus::GdiplusStartupInput gdiplusStartupInput;
  ULONG_PTR gdiplusToken;
  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  ////Konwertowanie grafiki
  Gdiplus::Graphics Grphx(/*this->*/Handle);
  Gdiplus::Image OrgImage(Old.w_str());
  Gdiplus::Image* Thumbnail = OrgImage.GetThumbnailImage(16, 16, NULL, NULL);
  Grphx.DrawImage(Thumbnail, 0, 0,Thumbnail->GetWidth(), Thumbnail->GetHeight());
  CLSID gifClsid;
  GetEncoderClsid(L"image/png", &gifClsid);
  Thumbnail->Save(New.w_str(), &gifClsid, NULL);
  delete Thumbnail;
  //Zakończenie sesji z GDIPlus
  Gdiplus::GdiplusShutdown(gdiplusToken);
}
//-----------------------------------------------------------------
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez polymorphism » poniedziałek, 25 lipca 2011, 22:13

Czyli jak rozumiem, biblioteki bez GDI+ zachowują się typowo, tak? W sumie trudno powiedzieć, co to może być. Być może faktycznie GDI+ coś miesza, choć niekoniecznie musi być to błąd.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez Cyfrowy Baron » wtorek, 26 lipca 2011, 08:03

W dokumentacji można przeczytać:


You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.




i przykład użycia:

KOD cpp:     UKRYJ  
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;

INT main()
{
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

   Image* image = new Image(L"FakePhoto.jpg");
   printf("The width of the image is %u.\n", image->GetWidth());
   printf("The height of the image is %u.\n", image->GetHeight());

   delete image;
   GdiplusShutdown(gdiplusToken);
   return 0;
}

Jak widać przed użyciem funkcji GdiplusShutdown obiekt image jest niszczony funkcją delete. W Twoim kodzie nigdzie nie niszczysz utworzonych obiektów, a przed wywołaniem tej funkcji należy to zrobić.
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: GDI+ i zmiana rozmiaru PNG

Nowy postprzez polymorphism » wtorek, 26 lipca 2011, 09:49

Czyli niech spróbuje dać wszystko w blok:
KOD cpp:     UKRYJ  
void __fastcall TSettingsForm::ConvertImage(UnicodeString Old, UnicodeString New)
{
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
       
        { // <----
                ////Konwertowanie grafiki
                ...
        } // <----
       
        Gdiplus::GdiplusShutdown(gdiplusToken);
}

Choć sensowniej byłoby przenieść inicjacje GDI+ do konstruktora i destruktora klasy TSettingsForm.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: GDI+ i zmiana rozmiaru PNG

Nowy postprzez beherit » wtorek, 26 lipca 2011, 10:18

Owszem próbowałem inicjować i wyładowywać GDI+ na formie ale jest tak samo - nie ma to znaczenia. @Cyfrowy Baron sugerowałem się nawet opisem na Twojej stronie ;) @polymorphism sprawdzę jeszcze Twoją radę ale obawiam się, że to tez nie pomoże yhm.
Obrazek
Avatar użytkownika
beherit
Homos antropiczny
Homos antropiczny
 
Posty: 62
Dołączył(a): poniedziałek, 16 lutego 2009, 19:55
Lokalizacja: Jarocin
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 10
Kompilator: C++Builder XE5
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

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

cron