2015-08-31 2 views
4

Я создаю изображения с массивом byte[] в C#, а затем преобразовываю их в Bitmap, чтобы сохранить их на диске.C# Растровое изображение: «Параметр недопустим» по размерам, которые не имеют значения 2

Вот несколько выдержек из моего кода:

// Create an array of RGB pixels 
byte[] pixels = new byte[width * height * 3]; 

// Do some processing here.... 

// Import the pixel data into a new bitma 
Bitmap image = new Bitmap(width, height, width * 3, PixelFormat.Format24bppRgb, GCHandle.Alloc(pixels, GCHandleType.Pinned).AddrOfPinnedObject()); 

// Save the image 
image.Save("testimage.png", ImageFormat.Png); 

Это хорошо работает, пока ширина/высота не является степенью 2 (т.е. 512x512 работ, но 511x511 не делает), а потом получить следующее сообщение об ошибке:

Unhandled Exception: System.ArgumentException: Parameter is not valid. 
    at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0) 
    (.......) 

Для справки, вот мои using заявления:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

Почему он не работает с наборами данных пикселей, которые не имеют размера, равного 2? Как я могу заставить его работать с такими размерами?

+1

Возможный дубликат [Почему должен «шаг» в конструктор System.Drawing.Bitmap будет кратен 4?] (http://stackoverflow.com/questions/2185944/why-must-stride-in-the-system-drawing-bitmap-constructor-be-a-multiple -of-4). – Micke

ответ

2

Micke прав, основная причина заключается в том, что в 32 бит размер регистра 4 байта так, чтобы оптимизировать скорость и эффективность должна быть кратна 4, Source

+0

Итак, используя 32-битный RGBA 'byte []', это исправит? – starbeamrainbowlabs

+0

Да, просто переключил мой код на 32-битный RGBA - это исправляет его :) Спасибо за помощь! – starbeamrainbowlabs