Czarne paski co kilka pikseli

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Czarne paski co kilka pikseli

Nowy postprzez Matthew » piątek, 10 kwietnia 2009, 12:41

Witam.

Mam problemy z odczytaniem wartosci poszczegolnych pikseli. Co 4 piksel ma wartosc 0 (Byte), mimo, ze jest bialy. Calosc realizuje takim kodem:

Kod: Zaznacz cały
                Graphics::TBitmap *bmp = wzorzec->Picture->Bitmap;

                Byte *linia;
                for(int i=0; i<wzorzec->Height; i++)
                {
                        linia = (Byte *)bmp->ScanLine[i];
                        for(int j=0; j<wzorzec->Width; j++)
                        {
                                tab[i * wzorzec->Width + j] += linia[j];
                        }
                }


wzorzec to komponent TImage. tab[] jest jednowymiarowa tablica typu int tworzona dynamicznie. Akcja wyglada tak, ze rysuje cos mysza po TImage, klikam na przycisk i kod ktory zamiescilem wykonuje sie. Czynnosc powtarzam 10 razy, nastepnie wszystkie wartosci dziele przez 10. Zaznaczam jednak, ze jeszcze przed dzieleniem, zaraz po wyrysowaniu pierwszego znaku, piksele odczytywane sa z bledem.

Zamieszczam dodatkowo obrazek dla lepszego pogladu.


Z gory dziekuje za jakakolwiek pomoc w rozwiazaniu problemu.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Matthew
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 24 sierpnia 2008, 13:59
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Czarne paski co kilka pikseli

Nowy postprzez Cyfrowy Baron » piątek, 10 kwietnia 2009, 15:25

Wraz z nowszymi wersjami środowiska C++ Builder i biblioteki Graphics.hpp zaszły zmiany w jej funkcjach i tak w nowszych wersjach funkcja ScanLine zwraca nie trzech argumentów lecz cztery.

standardowo masz: rgbRed, rgbGreen, rgbBlue
dochodzi jeszcze jeden argument: rgbReserved.
W plikach pomocy do Borland Developer Studio 2006 jest napisane, że powinien mieć wartość 0, lecz przy wartość równej 0 nie otrzymałem prawidłowej bitmapy,

Przykład prawidłowego zastosowania tej funkcji w nowszych wersjach znajdziesz w poradzie: porady -> grafika -> Konwersja bitmapy na szarą i monochromatyczną.
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
    NieznanyNieznana

Re: Czarne paski co kilka pikseli

Nowy postprzez polymorphism » piątek, 10 kwietnia 2009, 16:45

Cyfrowy Baron napisał(a):W plikach pomocy do Borland Developer Studio 2006 jest napisane, że powinien mieć wartość 0, lecz przy wartość równej 0 nie otrzymałem prawidłowej bitmapy,

Bo to zapewne uzależnione jest od wartości PixelFormat. Dla 24 bitów masz RGBTRIPLE, a dla 32 - RGBQUAD.

@Matthew, twój kod działałby, gdyby bitmapa była 8-bitowa (skala szarości), wtedy na jeden piksel przypada bajt.
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
    NieznanyNieznana

Re: Czarne paski co kilka pikseli

Nowy postprzez Cyfrowy Baron » piątek, 10 kwietnia 2009, 18:08

Bo to zapewne uzależnione jest od wartości PixelFormat. Dla 24 bitów masz RGBTRIPLE, a dla 32 - RGBQUAD.

Trochę nieprecyzyjnie się wyraziłem.
Zgodnie z plikiem pomocy ten parametr jest zarezerwowany i niewykorzystywany, dlatego zawsze powinno się mu przypisać wartość 0.

Nie chodzi tutaj dosłownie o funkcję ScanLine lecz o strukturę RGBQUAD, w której funkcja ScanLine przechowuje wartości. Matthew zamiast RGBQUAD użył zmiennej Byte i być może to właśnie powoduje nieprawidłowe skanowanie bitmapy. Sugerowałbym zastąpienie Byte strukturą RGBQUAD.


RGBQUAD
The RGBQUAD structure describes a color consisting of relative intensities of red, green, and blue.

typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;

Members
rgbBlue
Specifies the intensity of blue in the color.
rgbGreen
Specifies the intensity of green in the color.
rgbRed
Specifies the intensity of red in the color.
rgbReserved
Reserved; must be zero.


Remarks
The bmiColors member of the BITMAPINFO structure consists of an array of RGBQUAD structures.

Requirements
Windows NT/2000/XP/Vista: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Wingdi.h; include Windows.h.


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
    NieznanyNieznana

Re: Czarne paski co kilka pikseli

Nowy postprzez Matthew » piątek, 10 kwietnia 2009, 20:36

Cyfrowy Baron napisał(a):standardowo masz: rgbRed, rgbGreen, rgbBlue
dochodzi jeszcze jeden argument: rgbReserved.


Ahhaa czyli dlatego co 4 pixel byl czarny, bo jego wartosc wynosila 0. Zeby za duzo sie nie bawic dopisalem tylko dwa znaki w kodzie i efekt mam taki, jaki chcialem miec.

Kod: Zaznacz cały
tab[i * wzorzec->Width + j] += linia[j*4];

Dla moich potrzeb wystarczylo przemnozyc indeks przez 4.


polymorphism napisał(a):@Matthew, twój kod działałby, gdyby bitmapa była 8-bitowa (skala szarości), wtedy na jeden piksel przypada bajt.

To zabawne, bo wczesniej juz tak probowalem i z jakiegos powodu nie dzialalo, ale teraz faktycznie. Efekt jest prawidlowy :]
Kod: Zaznacz cały
bmp->PixelFormat=pf8bit;



Bardzo dziekuje wszystkim za szybka pomoc!
Serdecznie pozdrawiam!
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Matthew
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 24 sierpnia 2008, 13:59
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana


  • 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 0 gości