Как я могу преобразовать растровое изображение в массив 1D байт и наоборот в C#?
Я написал следующие методы,
public static byte[] BitmapToByteArray(Bitmap image) { byte[] returns = null; if (image.PixelFormat == PixelFormat.Format8bppIndexed) { BitmapData bitmapData = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, image.PixelFormat); int noOfPixels = image.Width * image.Height; int colorDepth = Bitmap.GetPixelFormatSize(image.PixelFormat); int step = colorDepth / 8; byte[] bytes = new byte[noOfPixels * step]; IntPtr address = bitmapData.Scan0; Marshal.Copy(address, bytes, 0, bytes.Length); //////////////////////////////////////////////// /// returns = (byte[])bytes.Clone(); /// //////////////////////////////////////////////// Marshal.Copy(bytes, 0, address, bytes.Length); image.UnlockBits(bitmapData); } else { throw new Exception("8bpp indexed image required"); } return returns; }
И,
public static Bitmap ByteArrayToBitmap(byte[] bytes, int width, int height, PixelFormat pixelFormat) { Bitmap bitmap = new Bitmap(width, height, pixelFormat); BitmapData bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); int colorDepth = Bitmap.GetPixelFormatSize(pixelFormat); int noOfChannels = colorDepth / 8; IntPtr address = bitmapData.Scan0; ////////////////////////////////////////////////////////////// // Marshal.Copy(bytes, 0, address, width * height * noOfChannels); // ////////////////////////////////////////////////////////////// bitmap.UnlockBits(bitmapData); return bitmap; }
Они, кажется, не работают,
http://i.stack.imgur.com/e3VFD.png
Как вы думаете, в чем была проблема?
Что я уже пробовал:
Н. Б.
Программа драйвера,
public class MainClass { public static void Main(string [] args) { Bitmap inputBmp = (Bitmap)Bitmap.FromFile(@"cameraman.gif"); byte[] bytes = Converter.BitmapToByteArray(inputBmp);//byte[65536] Bitmap outputBmp = Converter.ByteArrayToBitmap(bytes, inputBmp.Width, inputBmp.Height, PixelFormat.Format8bppIndexed); PictureDisplayForm f = new PictureDisplayForm(inputBmp, outputBmp); f.ShowDialog(); } }
Patrice T
Репост ?
[no name]
Нет.
Это было растровое изображение в 2D-целое число и наоборот.
Код тоже был другим.
dcmuggins
Я знаю, как это сделать, и я опубликую решение сегодня вечером, если оно вам все еще нужно. В настоящее время я нахожусь на работе и не имею доступа к Visual Studio. Дай мне знать!
[no name]
Спасибо за проявленный интерес.
Я решил проблему.
На самом деле это было вызвано цветовой палитрой.
dcmuggins
Отличная работа! Спасибо, что перезвонили мне