我有一个来自资源的Bitmap,需要把它放在一个字节数组中。我有一个SetPixel Methode用于操作字节数组中的像素。这很好用。我想要做的是首先加载一个我可以在以后操作它的数组中的图片。
我做了很多努力来完成这一点。首先我拥有:
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.我甚至试图手动输入步幅,它总是需要更大。
我觉得我明白这里完全错了。
答案 0 :(得分:0)
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。