Где в этом массиве хранятся значения RGB?

Я использую следующий элемент управления в своем элементе управления, который я создаю, чтобы позволить мне быстрее изменять пиксели в растровом изображении:

    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

Все это работает, позже, когда я получаю фактическое изображение после манипуляции, оно также работает нормально. Проблема заключается в установке этих фактических пикселей.

Из чего состоит этот массив? Я знаю, что он заполнен Integers, но что представляет каждый индекс? Сначала я думал, что он настроен так:

Массив-> [R пикселя 0,0][G пикселя 0,0][B пикселя 0,0][R пикселя 2,0][G пикселя 2,0][ B пикселей 2,0]

Однако это не работает правильно.


person Freesnöw    schedule 31.05.2012    source источник


Ответы (1)


Это зависит от значения ime.PixelFormat. Каждый пиксель может быть представлен как RGB, ARGB, индекс поиска палитры и т. д.

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

Кроме того, вам нужно быть осторожным с порядком байтов. Байты, скорее всего, будут в порядке байтов с прямым порядком байтов, но это зависит от вашей целевой платформы.

Для Format32bppArgb это может пролить свет на формат:

PixelFormat.Format32bppArgb имеет неправильный порядок байтов

person Steven Doggart    schedule 31.05.2012
comment
Итак, изучив его, я обнаружил, что это формат Format32bppArgb пикселей. Располагая этой информацией, не могли бы вы подробнее рассказать мне об этом? - person Freesnöw; 31.05.2012
comment
Ох, хорошо. Теперь это имеет смысл. Спасибо за помощь! +1 и чек для вас! - person Freesnöw; 01.06.2012