System.Drawing.Bitmap to Byte Array

本文关键字:Byte Array to Bitmap Drawing System | 更新日期: 2023-09-27 17:49:54

我有一个来自资源的位图,需要将其放入字节数组中。我有一个SetPixel方法来操作字节数组中的像素。这一切都很好。我想做的是,首先在数组中加载一个图片,以便稍后对其进行操作。

我做了很多努力来简化它。首先我有什么:

var resources = new ComponentResourceManager(typeof(Game));
var bmp = (Bitmap)(resources.GetObject("imgBall.Image"));

到目前为止,唯一没有给我错误消息(但显示图片错误(的是:

width = (int)bmp.Width;
height = (int)bmp.Height;
System.Windows.Media.PixelFormat pf = PixelFormats.Rgb24;
rawStride = (width * pf.BitsPerPixel + 7) / 8;
byte[] pixelData = new byte[rawStride * height];    
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
pixelData = ms.GetBuffer();

然后我尝试了我已经能在堆栈溢出中找到的解决方案:

ImageConverter imgConverter = new ImageConverter();
pixelData = (System.Byte[])imgConverter.ConvertTo(bmp, Type.GetType("System.Byte[]"));

这改变了pixelData的大小,所以我不能再使用它了。。。

using (MemoryStream memory = new MemoryStream())
            {
                bmp.Save(memory, ImageFormat.Bmp);
                memory.Position = 0;
                var bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                memory.Seek(0, SeekOrigin.Begin);
                bitmapImage.StreamSource = memory;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();
                int stride = width * ((bitmapImage.Format.BitsPerPixel + 7) / 8);                                
                bitmapImage.CopyPixels(pixelData, stride, 0);                
            }

在CopyPixels行,我很困惑:当我从上面(84(取rawStride时,我收到一条错误消息,它需要至少为112。当我计算bitmapImage(112(的步幅时,它抱怨它需要最小3136。我甚至试着手动输入步幅,它在各个方面都需要更大。

我有一种感觉,我理解这里完全不对劲的地方。

System.Drawing.Bitmap to Byte Array

public string BitmapToBase64(BitmapImage bi)
{
  MemoryStream ms = new MemoryStream();
  PngBitmapEncoder encoder = new PngBitmapEncoder();
  encoder.Frames.Add(BitmapFrame.Create(bi));
  encoder.Save(ms);
  byte[] bitmapdata = ms.ToArray();
  return Convert.ToBase64String(bitmapdata);
}

这应该是正确的。如果你想要的话,只需要返回byteArray。