簡體   English   中英

以適當的方式將圖像轉換為字節數組C#

[英]Convert image to byte array C# in a proper way

我的問題是我需要將圖像轉換為字節數組以獲取其像素。

我的圖像大小為268x188,當我使用屬性PixelsFormat時,它返回Format24bppRgb ,因此我知道每個像素包含3個字節。

如果是這樣,像素的大小應為268 * 188 * 3 = 151152字節,但是我創建的字節數組的大小為4906字節,這是我計算機中圖像文件的大小。

我不知道是否還有另一種獲取這些像素的方法,或者您只能獲取圖像文件的大小。

如果要忽略標題和文件壓縮,可以執行以下操作。

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

要獲取圖像像素,請嘗試以下操作:

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

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

似乎有一種非常簡單的方法:

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

希望這可以幫助。 ^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM