shadowano Skrevet 13. juli 2009 Del Skrevet 13. juli 2009 (endret) Hei Jeg benytter følgende kode, og skjønner ikke hvorfor den feiler på et vanlig 768x1024 px bilde. Jeg får AccessViolationException was unhandled. Attempted to read or write protected memory. Feilern skjer når i og j er hhv 767 og 1023, og når koden peker på dBlue = (double)Math.Floor((ImPtr[3] * dBinSize) / 256); BitmapData BmpData = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe { byte* ImPtr = (byte*)BmpData.Scan0; for (int i = 0; i < BmpData.Height; i++) { for (int j = 0; j < BmpData.Width; j++) { dGreen = (double)Math.Floor((ImPtr[1] * dBinSize) / 256); dRed = (double)Math.Floor((ImPtr[2] * dBinSize) / 256); dBlue = (double)Math.Floor((ImPtr[3] * dBinSize) / 256); ImPtr += 3; // 3 bytes pr pixel } // Skip unused space ImPtr += BmpData.Stride - (BmpData.Width * 3); } } image.UnlockBits(BmpData); Håper noen har en fin løsning på problemet:) På forhånd takk:) Endret 13. juli 2009 av martin82 Lenke til kommentar
hockey500 Skrevet 15. juli 2009 Del Skrevet 15. juli 2009 (endret) Har du vurdert å prøve indeks 0 til 2 istedenfor 1 til 3? jeg regner med at formatet er bgra, ikke argb. Koden din tilsier at den ene byten (alpha) er ubrukt. Da må du plusse på 4, ikke 3 bytes i den innerste løkken. da er det også unødvendig å skippe "unused space" slik du gjør nå, det virker overflødig. prøv dette (utestet): BitmapData BmpData = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); unsafe { byte* ImPtr = (byte*)BmpData.Scan0; for (int i = 0; i < BmpData.Height; i++) { for (int j = 0; j < BmpData.Width; j++) { dGreen = (double)Math.Floor((ImPtr[2] * dBinSize) / 256); dRed = (double)Math.Floor((ImPtr[1] * dBinSize) / 256); dBlue = (double)Math.Floor((ImPtr[0] * dBinSize) / 256); ImPtr += 4; // 4 bytes pr pixel } } } image.UnlockBits(BmpData); EDIT: jeg testet nå på min PC, og såvidt jeg kan se er det ikke noe tom byte, så bruk 0-2 (i omvendt rekkefølge, det var bgr, ikke rgb) og dropp den spacing-greia di. dette funket for meg for å kopiere et bitmap: public static unsafe void test(Bitmap src) { BitmapData data = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); Bitmap copy = new Bitmap(src.Width, src.Height); byte* ptr = (byte*)data.Scan0; for (int y = 0; y < data.Height; y++) { for (int x = 0; x < data.Width; x++) { copy.SetPixel(x, y, Color.FromArgb(ptr[2], ptr[1], ptr[0])); ptr += 3; } } src.UnlockBits(data); copy.Save(@"C:\copy.jpg", ImageFormat.Jpeg); } Endret 15. juli 2009 av hockey500 Lenke til kommentar
shadowano Skrevet 15. juli 2009 Forfatter Del Skrevet 15. juli 2009 Det virket nå Hvordan vet jeg egentlig om fargene er i argb eller bgra? Takk for hjelpen! Lenke til kommentar
hockey500 Skrevet 15. juli 2009 Del Skrevet 15. juli 2009 si det... jeg bare sjekker det ved å sammenlikne med photoshop (eye drop tool). evt kan du, hvis du bruker 32-bits dybde, sjekke om ptr[0] eller ptr[3] er 0 eller 255. da er det sannsynligvis alpha. Lenke til kommentar
GeirGrusom Skrevet 15. juli 2009 Del Skrevet 15. juli 2009 Det står i PixelFormat egenskapen til bildet, men etter det jeg vet vil bildet alltid være BGRA allikevel, siden Windows bruker dette formatet internt. Lenke til kommentar
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å