以适当的方式将图像转换为字节数组C#

时间:2018-09-14 07:37:28

标签: c# .net image byte

我的问题是我需要将图像转换为字节数组以获取其像素。

我的图像大小为268x188,当我使用属性PixelsFormat时,它返回Format24bppRgb,因此我知道每个像素包含3个字节。

如果为真,则像素大小应为268 * 188 * 3 = 151152字节,但我创建的字节数组的大小为4906字节,这是我计算机中图像文件的大小

我不知道是否还有其他方法可以获取这些像素,或者您只能获取图像文件的大小。

4 个答案:

答案 0 :(得分:0)

我在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);
 }

答案 1 :(得分:0)

似乎有一种非常简单的方法:

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

希望这会有所帮助。 ^^

答案 2 :(得分:0)

如果要忽略文件头和压缩,可以执行以下操作。

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);
}

答案 3 :(得分:0)

要获取图像像素,请尝试以下操作:

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