User 6976447 Ответов: 0

Как я могу преобразовать растровое изображение в массив 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

Отличная работа! Спасибо, что перезвонили мне

0 Ответов