c# - new - ¿Por qué “stride” en el constructor System.Drawing.Bitmap debe ser un múltiplo de 4?




image to bitmap c# (4)

Código correcto:

public static void GetStride(int width, PixelFormat format, ref int stride, ref int bytesPerPixel)
{
    //int bitsPerPixel = ((int)format & 0xff00) >> 8;
    int bitsPerPixel = System.Drawing.Image.GetPixelFormatSize(format);
    bytesPerPixel = (bitsPerPixel + 7) / 8;
    stride = 4 * ((width * bytesPerPixel + 3) / 4);
}

Estoy escribiendo una aplicación que requiere que tome un formato de mapa de bits de propietario (un MVTec Halcon HImage) y lo convierta en un System.Drawing.Bitmap en C #.

Las únicas funciones exclusivas que me dieron para ayudarme a hacer esto me implican escribir en el archivo, excepto el uso de la función "obtener puntero".

Esta función es excelente, me da un puntero a los datos de píxeles, el ancho, la altura y el tipo de imagen.

Mi problema es que cuando creo mi System.Drawing.Bitmap usando el constructor:

new System.Drawing.Bitmap(width, height, stride, format, scan)

Necesito especificar una "zancada" que sea un múltiplo de 4. Esto puede ser un problema ya que no estoy seguro de qué tamaño de mapa de bits será alcanzado mi función. Suponiendo que termine con un mapa de bits que es 111x111 píxeles, no tengo otra forma de ejecutar esta función que no sea agregar una columna falsa a mi imagen o restar 3 columnas.

¿Hay alguna manera de que pueda escabullirme de esta limitación?


Como se ha dicho antes por Jake, usted calcula el paso encontrando los bytes por píxel (2 por 16 bits, 4 por 32 bits) y luego los multiplica por el ancho. Entonces, si tiene un ancho de 111 y una imagen de 32 bits, tendría 444, que es un múltiplo de 4.

Sin embargo, digamos por un minuto que tiene una imagen de 24 bits. 24 bits es igual a 3 bytes, por lo que con un ancho de 111 píxeles tendría 333 como su paso. Obviamente, esto no es un múltiplo de 4. Por lo tanto, querría redondear a 336 (el siguiente múltiplo más alto de 4). A pesar de que tiene un poco de extra, este espacio no utilizado no es lo suficientemente significativo como para realmente hacer una gran diferencia en la mayoría de las aplicaciones.

Desafortunadamente, no hay forma de evitar esta restricción (a menos que siempre use imágenes de 32 o 64 bits, que siempre son múltiplos de 4).


Porque está usando int32 para almacenar cada píxel.

Sizeof(int32) = 4

Pero no se preocupe, cuando la imagen se guarde de la memoria al archivo, utilizará el uso de memoria más eficiente posible. Internamente utiliza 24 bits por píxel (8 bits rojo, 8 verde y 8 azul) y deja los últimos 8 bits redundantes.


Recuerde que la stride es diferente del width . Puede tener una imagen que tiene 111 píxeles (8 bits) por línea, pero cada línea se almacena en la memoria de 112 bytes.

Esto se hace para hacer un uso eficiente de la memoria y, como dijo @Ian, está almacenando los datos en int32 .





bitmap