为了账号安全,请及时绑定邮箱和手机立即绑定

将位图转换为字节数组

将位图转换为字节数组

C#
holdtom 2019-10-20 16:12:46
将位图转换为字节数组使用C#,是否有更好的方法来转换WindowsBitmap转到byte[]保存到临时文件并使用FileStream?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

内存流对此很有帮助。您可以将其放入扩展方法中:

public static class ImageExtensions{
    public static byte[] ToByteArray(this Image image, ImageFormat format)
    {
        using(MemoryStream ms = new MemoryStream())
        {
            image.Save(ms, format);
            return ms.ToArray();
        }
    }}

你可以用它就像:

var image = new Bitmap(10, 10);// Draw your imagebyte[] arr = image.ToByteArray(ImageFormat.Bmp);

在图像转换器方面,我部分地不同意prestuanifto的回答。不要使用图像转换器。从技术上讲,它没有什么问题,但它使用装箱/从对象取消装箱这一事实告诉我,它是来自.NET框架旧的黑暗地方的代码,与图像处理一起使用并不理想(至少在转换为字节[]时是过度的),特别是当您考虑以下情况时。

我看了看ImageConverterNET框架使用的代码,在内部它使用的代码几乎与我前面提供的代码相同。它创造了一个新的MemoryStream,保存Bitmap在您提供它时,它的格式是什么,并返回数组。跳过创建ImageConverter类使用MemoryStream



查看完整回答
反对 回复 2019-10-21
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

你也可以只是马歇尔.复制位图数据。没有中间内存流等和一个快速的内存副本。这应该同时适用于24位和32位图。

public static byte[] BitmapToByteArray(Bitmap bitmap){

    BitmapData bmpdata = null;

    try
    {
        bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
        int numbytes = bmpdata.Stride * bitmap.Height;
        byte[] bytedata = new byte[numbytes];
        IntPtr ptr = bmpdata.Scan0;

        Marshal.Copy(ptr, bytedata, 0, numbytes);

        return bytedata;
    }
    finally
    {
        if (bmpdata != null)
            bitmap.UnlockBits(bmpdata);
    }}



查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信