GDI PLUS - Szybka zamiana kolorów w obrazku

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

GDI PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Corvis » piątek, 25 czerwca 2010, 06:49

Witam,

Napisałem sobie funkcję do zamiany kolorów na klasie TBitmap:

Kod który to realizuje:

Kod: Zaznacz cały
bmpOrginal->LoadFromFile(NazwaPliku);
        TRGBTriple *ptr = 0;
        for(int i=0;i < bmpOrginal->Height;i++) {
            ptr = reinterpret_cast<TRGBTriple *>(bmpOrginal->ScanLine[i]);

            for(int j=0; j < bmpOrginal->Width; j++) { 
                if(ptr[j].rgbtRed == 0xFF && ptr[j].rgbtGreen == 0xFF && ptr[j].rgbtBlue == 0xFF) {
                    ptr[j].rgbtBlue   = 0xC0;
                    ptr[j].rgbtGreen  = 0xC0;
                    ptr[j].rgbtRed    = 0xC0;
                } else {
                    ptr[j].rgbtBlue   = 0x00;
                    ptr[j].rgbtGreen  = 0x00;
                    ptr[j].rgbtRed    = 0x00;
                }
            }
        }


Teraz chce zrobić coś podobnego na klasie Gdiplus::bitmap, posiada ona metody GetPixel() i SetPixel() i robiąc to w ten sposób:
Kod: Zaznacz cały
for(int i=0;i<bitmapa->GetWidth(); ++i) {
    for(int j=0;j<bitmapa->GetHeight(); ++j) {
      // tutaj pobranie koloru za pomocą GetPixel i zamiana go za pomocą SetPixel;
     }
}


Chodzi to piekielnie wolno bo robi to po pixelu. Czy da się to zrobić za pomocą GDI szybciej ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: GDI PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Corvis » piątek, 25 czerwca 2010, 07:43

Problem rozwiązany podaje kod:


Kod: Zaznacz cały
    Gdiplus::Graphics NowyObrazek(Image1->Canvas->Handle);
   
    NowyObrazek.Clear(clBlack);
    NowyObrazek.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic); // sposób skalowania obrazka

    Gdiplus::ColorMap cm[3]; // mapa zmiany kolorów

    cm[0].oldColor = Gdiplus::Color(0xFF,0xFF,0xFF); 
    cm[0].newColor = Gdiplus::Color(0xC0,0xC0,0xC0);

    cm[1].oldColor = Gdiplus::Color(0xFF,0x00,0xFF);
    cm[1].newColor = Gdiplus::Color(0x00,0x00,0x00);

    cm[2].oldColor = Gdiplus::Color(0x00,0x00,0xFF);
    cm[2].newColor = Gdiplus::Color(0x00,0x00,0x00);

    Gdiplus::ImageAttributes imgAttrs;
    imgAttrs.SetRemapTable(3,cm,Gdiplus::ColorAdjustTypeBitmap);

    NowyObrazek.DrawImage(
        bmp,
        Gdiplus::Rect(0, 0, MalowanieW, MalowanieH),  // MalowanieW , MalowanieH ( Dlugosc i szerokosc obrazka jaka chcemy uzyskac )
        0,
        0,
        bmp->GetWidth(),
        bmp->GetHeight(),
        Gdiplus::UnitPixel,
        &imgAttrs
    );



Mam też inne pytanie:

Czy za każdym razem trzeba pobierać uchwyt :
Kod: Zaznacz cały
Gdiplus::Graphics NowyObrazek(Image1->Canvas->Handle);

i ustawiać tą zamianę kolorów, podczas przemalowywania ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: GDI PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez polymorphism » piątek, 25 czerwca 2010, 09:41

Czy za każdym razem trzeba pobierać uchwyt :

A w czym problem?

(...) i ustawiać tą zamianę kolorów, podczas przemalowywania ??

No raczej. DrawImage służy do malowania bitmapy, a nie zmiany trybu pracy obiektu klasy Graphics. Jeśli tego typu ustawienia miałyby mieć charakter globalny (w ramach obiektu), zrobiliby oddzielną, specjalnie do tego celu metodę.
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 PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Cyfrowy Baron » piątek, 25 czerwca 2010, 10:42

Czy za każdym razem trzeba pobierać uchwyt :


Tego inaczej nie da się chyba 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 PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Corvis » piątek, 25 czerwca 2010, 11:49

A w czym problem?


Może to nie problem ale moje bmp są duże:

2643x1775 i zajmują po 10 mb.

Dlatego pytam bo troche boli komputer mielenie takich bmp :)

Odrazu odpowiadam na kolejne pytanie dlaczego takie duże skaluje - dla uzyskania jak najlepszej jakości obrazu do późniejszego zaznaczania na nim.


Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: GDI PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Cyfrowy Baron » piątek, 25 czerwca 2010, 12:02

Jak to się ma do pobierania uchwytu?

Kod: Zaznacz cały
Gdiplus::Graphics NowyObrazek(Image1->Canvas->Handle);


Przecież pobranie uchwytu nie generuje jakichś opóźnień, wszak pobierasz uchwyt do Canvas obiektu Image i na nim rysujesz, przechowywanie tego uchwytu w pamięci niczego nie zmieni. Opóźnienie wywołuje funkcja DrawImage, ale tutaj niczego nie przyspieszysz, gdyż na wykonania zadania funkcja potrzebuje czasu i czy byś przechowywał uchwyt do obiektu w pamięci, czy też pobierasz go na bieżąco niczego nie przyspieszysz.
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 PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez polymorphism » piątek, 25 czerwca 2010, 12:05

Może to nie problem ale moje bmp są duże: (...)

No ale uchwyt, o którym mowa jest uchwytem kontekstu urządzenia (HDC), zatem kwestia wielkości bitmap nie ma większego związku z nim.
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 PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Corvis » poniedziałek, 28 czerwca 2010, 09:57

Jeszcze jedno pytanie:

Czy ten uchwyt trzeba zwalaniać jakoś ?
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: GDI PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez polymorphism » poniedziałek, 28 czerwca 2010, 10:09

Nie, ponieważ właścicielem kontekstu jest obiekt Image1.
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 PLUS - Szybka zamiana kolorów w obrazku

Nowy postprzez Corvis » poniedziałek, 28 czerwca 2010, 10:12

dzieki
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 2 gości

cron