Правильно конвертировать изображение в байтовый массив C # - PullRequest
0 голосов
/ 14 сентября 2018

Моя проблема в том, что мне нужно преобразовать изображение в байтовый массив, чтобы получить его пиксели.

Размер моего изображения 268x188, и когда я использую свойство PixelsFormat, оно возвращает Format24bppRgb, поэтому я понимаю, что каждый пиксель содержит 3 байта.

Если это так, размер пикселей должен быть 268 * 188 * 3 = 151152 байта, но размер создаваемого мной байтового массива составляет 4906 байтов, что соответствует размеру файла изображения на моем компьютере. .

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

Ответы [ 4 ]

0 голосов
/ 14 сентября 2018

Чтобы получить пиксель изображения попробуйте это:

public static byte[] GetImageRaw(Bitmap image)
{
    if (image == null)
    {
        throw new ArgumentNullException(nameof(image));
    }

    if (image.PixelFormat != PixelFormat.Format24bppRgb)
    {
        throw new NotSupportedException("Invalid pixel format.");
    }

    const int PixelSize = 3;

    var data = image.LockBits(
        new Rectangle(Point.Empty, image.Size),
        ImageLockMode.ReadWrite,
        image.PixelFormat);

    try
    {
        var bytes = new byte[data.Width * data.Height * PixelSize];

        for (var y = 0; y < data.Height; ++y)
        {
            var source = (IntPtr)((long)data.Scan0 + y * data.Stride);

            // copy row without padding
            Marshal.Copy(source, bytes, y * data.Width * PixelSize, data.Width * PixelSize);
        }

        return bytes;
    }
    finally
    {
        image.UnlockBits(data);
    }
}

Взгляните на Bitmap.LockBits

0 голосов
/ 14 сентября 2018

Кажется, есть довольно простой способ сделать это:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
 MemoryStream ms = new MemoryStream();
 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
 return  ms.ToArray();
}

Надеюсь, это поможет.^^

0 голосов
/ 14 сентября 2018

Если вы хотите игнорировать заголовок и сжатие файла, вы можете сделать следующее:

var path = ...
using(var image = Image.FromFile(path))
using(var bitmap = new Bitmap(image))
{
    var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);

    var bytesPerPixel = 4; // bitmapData.PixelFormat (image.PixelFormat and bitmapData.PixelFormat can be different)
    var ptr = bitmapData.Scan0;
    var imageSize = bitmapData.Width * bitmapData.Height * bytesPerPixel;
    var data = new byte[imageSize];
    for (int x = 0; x < imageSize; x += bytesPerPixel)
    {
        for(var y = 0; y < bytesPerPixel; y++)
        {
            data[x + y] = Marshal.ReadByte(ptr);
            ptr += 1;
        }
    }

    bitmap.UnlockBits(bitmapData);
}
0 голосов
/ 14 сентября 2018

Я использую этот код в приложении ASP.NET.Очень просто:

var imagePath = GetFilePathToYourImage();

 using (var img = System.IO.File.OpenRead(imagePath))
 {
        var imageBytes = new byte[img.Length];
        img.Read(imageBytes, 0, (int)img.Length);
 }
...