Gå til innhold

Anbefalte innlegg

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 av martin82
Lenke til kommentar
Videoannonse
Annonse

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++;
}

Lenke til kommentar
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 av martin82
Lenke til kommentar

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 av martin82
Lenke til kommentar

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?

Lenke til kommentar

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:)

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...