shadowano Skrevet 1. mars 2008 Skrevet 1. mars 2008 (endret) Jeg har forstått det slik at byte* ImPtr = (byte*)BmpData.Scan0; gir meg en peker til første pixel øverst til venstre i et gitt bilde. ImPtr[1] gir meg rød, ImPtr[2] gir meg grønn og ImPtr[3] gir meg blå i det pixelet vi er i. Hvis jeg trenger å få tak i pixelet etter den jeg er på nå, skriver jeg bare ImPtr[4] for rødfargen? Og hvis jeg ønsker å speile et bilde så kan jeg bruke: last = ImPtr[bmpData.Width]; first = ImPtr[1]; ImPtr[bmpData.Width] = first; ImPtr[1] = last; ? Jeg har prøvd på dette, bare at jeg endret koden til å være generisk (speile alle pixlene ved denne metoden), men bildet så helt rart ut:P Ble grått og strukket Er det å foretrekke å gjøre bildebehandlingen i samme loop, eller å kopiere hele bildedata til en array og loope gjennom arrayen etterpå? Endret 1. mars 2008 av martin82
GeirGrusom Skrevet 2. mars 2008 Skrevet 2. mars 2008 Det er enklere å definere en struktur en å gå igjennom alle bytene manuelt på den måten struct rgba { public byte red; public byte green; public byte blue; public byte alpha; public rgba(byte r, byte g, byte b) { red = r; green = g; blue = b; alpha = 255; } public rgba(byte r, byte g, byte b, byte a) : rgba(r, g, b) { alpha = a; } } for et 32-bit ukalkulert alpha bilde (32-bit RGBA) Deretter bruker du den strukturen som peker istedet for byte pekeren rgba* ptr = (rgba*)imgdata.Scan0.ToPointer(); for(int i = 0; i < imgdata.Width * imgdata.Height; i++) { ptr->red = 0; ptr++; }
shadowano Skrevet 2. mars 2008 Forfatter Skrevet 2. mars 2008 (endret) Det er enklere å definere en struktur en å gå igjennom alle bytene manuelt på den måten struct rgba { public byte red; public byte green; public byte blue; public byte alpha; public rgba(byte r, byte g, byte b) { red = r; green = g; blue = b; alpha = 255; } public rgba(byte r, byte g, byte b, byte a) : rgba(r, g, b) { alpha = a; } } Hvordan får jeg oversatt arvingen din til C#? Får bare feil på den nå slik den er her... Og man må vel ta hensyn til Striden i koden din? Endret 2. mars 2008 av martin82
GeirGrusom Skrevet 2. mars 2008 Skrevet 2. mars 2008 bare slett den siste eller noe, tenkte ikke på at man kanskje ikke kan kalle andre constructorer i struct.
shadowano Skrevet 2. mars 2008 Forfatter Skrevet 2. mars 2008 (endret) Jeg får en AccessViolationException "Attempted to read or write protected memory". Jeg har definert BmpData slik: BitmapData BmpData = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); Feilen kommer når i = 1 243 136 og BmpData.Height * BmpData.Width i bildet er 1 656 480 (1680*986). Endret 2. mars 2008 av martin82
shadowano Skrevet 2. mars 2008 Forfatter Skrevet 2. mars 2008 Hvordan kan jeg gjøre structen generisk med tanke på bildeformatet? Evt hvordan ser den ut når jeg kun bruker 24 bit bilder?
GeirGrusom Skrevet 2. mars 2008 Skrevet 2. mars 2008 Da fjerner du Alpha kanalen. I de fleste tilfeller oversetter .NET bildet til 32Bit RGB hvor alpha kanalen er ubrukt.
shadowano Skrevet 2. mars 2008 Forfatter Skrevet 2. mars 2008 Jeg har bare denne funksjonen i structen: public rgba(byte r, byte g, byte b) { red = r; green = g; blue = b; alpha = 255; } Så da tar den jo kun i mot R, G og B for hvert pixel, og spiser ikke opp farger fra pixlene etter? Eller er det noe annet jeg ikke helt forstår?
shadowano Skrevet 2. mars 2008 Forfatter Skrevet 2. mars 2008 Jeg klarer heller ikke helt å se hvordan jeg kan manuelt speile et bilde når jeg bruker pekere til minnet. Hvordan får jeg f.eks tak i siste pixel når jeg står i første pixel? Dette går tilbake til første innlegget her... Takk for hjelp så langt:)
GeirGrusom Skrevet 2. mars 2008 Skrevet 2. mars 2008 Du må kanskje lag et nytt bitmap og speile det over i det
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå