Question

I've been using the following sub in my control that I'm creating to let me modify the pixels in a bitmap faster:

    Protected Sub LockForMemory()
        idata = ime.LockBits(New Rectangle(0, 0, ime.Width, ime.Height), ImageLockMode.WriteOnly, ime.PixelFormat)
        ipoint = idata.Scan0

        ibytes = Math.Abs(idata.Stride) * ime.Height
        ReDim irgbvalues(ibytes - 1)
        System.Runtime.InteropServices.Marshal.Copy(ipoint, irgbvalues, 0, ibytes)
    End Sub

All of that works, later when I go to retrieve the actual image after manipulation, it works fine as well. The problem is setting those actual pixels.

What is this array of? I know that it's filled with Integers but what does each indice represent? At first I thought it was setup like this:

Array-> [R of Pixel 0,0][G of Pixel 0,0][B of Pixel 0,0][R of Pixel 2,0][G of Pixel 2,0][B of Pixel 2,0]

This doesn't seem to work right, however.

Was it helpful?

Solution

It depends on the value of ime.PixelFormat. Each pixel may be represented as RGB, ARGB, palette look-up index, etc.

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat.aspx

Also, you need to be careful of byte-order. The bytes would likely be in little-endian byte-order, but it depends on your target platform.

For Format32bppArgb, this may shed some light on the format:

PixelFormat.Format32bppArgb seems to have wrong byte order

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top