CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pobieranie wartości pixela z TImage

Pobieranie wartości pixela z TImage

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Pobieranie wartości pixela z TImage

Nowy postprzez Corvis » środa, 1 sierpnia 2012, 10:40

Witam,

Mam taki kod:

KOD cpp:     UKRYJ  
for(int w = 0; w < Image1->Width; ++w) {
    for(int h = 0; h < Image1->Height; ++h) {
          ShowMessage(Image1->Picture->Bitmap->Canvas->Pixels[w][h]);
     }
}
 


Może mi ktoś powiedzieć dlaczego cały czas wyświetla mi -1 mimo, że obrazek jest wczytany ? Czy może mieć znaczenie, że do Image wczytany jest PNG.

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 7Chrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Mironas » środa, 1 sierpnia 2012, 11:17

Tak - PNG ma znaczenie. W ten sposób możesz odczytywać kolor piksela tylko jeśli do TImage jest wczytane BMP.

Przy okazji - współrzędne piksela podajesz wyliczasz wg rozmiaru TImage. Wiesz że wczytany obraz może mieć inny rozmiar?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Corvis » środa, 1 sierpnia 2012, 11:18

Wiem, że rozmiar może być inny ale to kod testowy.

Da się odczytać wartość pixela dla PNG ??
"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 7Chrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Mironas » środa, 1 sierpnia 2012, 11:32

Musisz zamienić PNG na BMP. Kod z C++Builder XE:

KOD cpp:     UKRYJ  
  // wczytaj obraz do PNG
  TPngImage* PNG = new TPngImage();
  PNG->LoadFromFile(plik);

  // przepisz PNG do BMP
  Graphics::TBitmap* tBMP = new Graphics::TBitmap();
  tBMP->Assign(PNG);

  [...]

  delete PNG;
  delete tBMP;
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Corvis » środa, 1 sierpnia 2012, 12:31

KOD cpp:     UKRYJ  
        Graphics::TBitmap* tBMP = new Graphics::TBitmap();

        tBMP->Assign(Image1->Picture->Bitmap); // TO raczej słabo wygląda

        for(int w = 0; w < tBMP->Width; ++w) {
                for(int h = 0; h < tBMP->Height; ++h) {
                        ShowMessage((int)tBMP->Canvas->Pixels[w][h]);
                }
        }

        delete tBMP;
 


To w ogóle nie działa nie wchodzi w pętle. Ja muszę pobrać z Image obrazek. Podejrzewam, że chodzi o "zassanie" png do bmp
"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 7Chrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Mironas » środa, 1 sierpnia 2012, 12:59

Raczej tak:

KOD cpp:     UKRYJ  
  TPngImage* PNG = new TPngImage();
  PNG->Assign(Image1->Picture);

  Graphics::TBitmap* tBMP = new Graphics::TBitmap();
  tBMP->Assign(PNG); // TO raczej słabo wygląda

  for(int w = 0; w < tBMP->Width; ++w)
    for(int h = 0; h < tBMP->Height; ++h)
      ShowMessage((int)tBMP->Canvas->Pixels[w][h]);

  delete tBMP;
  delete PNG;
 


Oddzielny komunikat dla każdego piksela może być denerwujący. Lepiej np wstawić TMemo i zamienić ShowMessage na:
KOD cpp:     UKRYJ  
  // na początku
  String s;
 
  // w pętli
  s.sprintf(L"%i, ", tBMP->Canvas->Pixels[w][h]);
  Memo1->Lines->Text = Memo1->Lines->Text + s;
 

Za ten post autor Mironas otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Corvis » środa, 1 sierpnia 2012, 13:29

mpsoft, komunikat jest tylko dla mnie na testy żeby zobaczyć co program wyświetla :)

Faktycznie takie rzutowanie pomogło, dzięki
"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 7Chrome

Re: Pobieranie wartości pixela z TImage

Nowy postprzez Cyfrowy Baron » środa, 1 sierpnia 2012, 16:42

mpsoft napisał(a):
KOD cpp:     UKRYJ  
  TPngImage* PNG = new TPngImage();
  PNG->Assign(Image1->Picture);


To akurat jest zbędne, gdyż można zamiast do TPicture odwołać się do TGraphic, czyli coś w tym stylu:

KOD cpp:     UKRYJ  
  Graphics::TBitmap* tBMP = new Graphics::TBitmap();
  tBMP->Assign(Image1->Picture->Graphic);

   TColor kolor = tBMP->Canvas->Pixels[10][10];

   int cRGB = ColorToRGB(kolor);
   int R = GetRValue(cRGB);
   int G = GetGValue(cRGB);
   int B = GetBValue(cRGB);

   TVarRec vr[] = {R, G, B};
   ShowMessage( Format("Składowe RGB: R=%d; G=%d; B=%d", vr, 3) + "\nKolor: " + ColorToString(kolor) );

  delete tBMP;


Zaletą tego rozwiązanie jest to, że niezależnie od tego jaki format obrazu masz w Image zawsze zostanie on przekonwertowany na bitmapę.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
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


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

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

cron