Gå til innhold

C#: Loop gjennom pixler med peker feiler i slutten av bildet


Anbefalte innlegg

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

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 av hockey500
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...