BitMapImage 到字节和反转

Posted

技术标签:

【中文标题】BitMapImage 到字节和反转【英文标题】:BitMapImage to byte and reverse 【发布时间】:2016-06-20 07:17:42 【问题描述】:

两天以来,我尝试在 WPF 应用程序中管理我的图像,但出现错误和错误错误,...

图像显示在 System.Windows.Control.Image 中。 出于这个原因,我尝试使用变量 BitMapImage。

现在出现错误:“无法访问关闭流”,我找不到解决方案。

我为转换创建了两个函数:

public static BitmapImage ConvertToBitMapImage(byte[] bytes)
    
        if (bytes == null || bytes.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(bytes))
        
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        
        //image.Freeze();
        return image;
    

    public static byte[] ImageToByte(BitmapImage imageSource)
    
        Stream stream = imageSource.StreamSource;
        Byte[] buffer = null;
        if (stream != null && stream.Length > 0)
        
            using (BinaryReader br = new BinaryReader(stream))
            
                buffer = br.ReadBytes((Int32)stream.Length);
            
        

        return buffer;
    

在我的对象中我有一个属性:

        public BitmapImage MiniatureApp
    
        get
        
            if (IMAGES != null)
                _MiniatureApp = Tools.BinaryImageConverter.ConvertToBitMapImage(IMAGES.IMAGE);
            return _MiniatureApp;
        
        set
        
            if (this.IMAGES != null)
                this.IMAGES.IMAGE = Tools.BinaryImageConverter.ImageToByte((BitmapImage)value);
            else
            
                IMAGES img = new IMAGES();
                img.NOM = "";
                img.IMAGE = Tools.BinaryImageConverter.ImageToByte((BitmapImage)value);
                this.IMAGES = img;
            
            NotifyPropertyChanged();
        
    

我主要是这样做的:

FileStream fs = new FileStream(pathImage, FileMode.Open, FileAccess.Read);
byte[] data = new byte[fs.Length];
fs.Read(data, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
VMAppareil.VMApp.CurrentAppareil.MiniatureApp = Tools.BinaryImageConverter.ConvertToBitMapImage(data);

是否有解决我的问题的方法或最好的方法?

戈贝莱特。

【问题讨论】:

您的 ImageToByte 方法不正确,因为当您尝试访问 StreamSource 时它已关闭。这就是 BitmapCacheOption.OnLoad 所做的。这个答案解释了如何将 BitmapImage 保存到字节数组:***.com/a/6597746/5574010 有什么理由将图像存储为字节数组(在 IMAGES.IMAGE 中)? 【参考方案1】:

您可以修复您的解决方案,用以下方法替换 ImageToByte 方法(借用自 https://***.com/a/6597746/5574010)

public static byte[] ImageToByte(BitmapImage imageSource)

    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(imageSource));

    using (var ms = new MemoryStream())
    
        encoder.Save(ms);
        return ms.ToArray();
    

您之前的解决方案不起作用,因为只要您的代码退出 unit 语句,ConvertToBitMapImage 方法就会关闭您分配给 image.StreamSource 的流。当您将 ImageToByte 方法作为 MiniatureApp 设置器的一部分调用时,StreamSource 将关闭并且您会收到错误消息。

【讨论】:

我的图片是从数据库加载的。我没有其他选择从字节加载我的图像 好的。您的 main 似乎从磁盘上的文件加载字节,但也许这只是一个例子。 这是我的例子,我第一次从磁盘加载并将其转换为字节并尝试从字节加载但它不起作用:p 编辑了我的回复,我认为可以解决您的问题。【参考方案2】:

我不太确定你在用 getter-setter 做什么。

为了从文件中获取字节数组,我会这样:

public static byte[] FileToByteArray(string fileName)

    byte[] fileData = null;

    using (FileStream fs = new File.OpenRead(fileName)) 
     
        var binaryReader = new BinaryReader(fs); 
        fileData = binaryReader.ReadBytes((int)fs.Length); 
    
    return fileData;

一旦您从该函数获得字节,您就可以使用ConvertToBitMapImage() 并将其分配给 Image.Source,如下所示:

byte[] bytes = FileToByteArray(fileName);
YourImage.Source = ConvertToBitMapImage(bytes);

我不确定你为什么需要将 BitmapImage 转换为字节,但你应该可以直接调用你的函数:

BitmapImage bImg = new BitmapImage();
bImg.Source = ConvertToBitMapImage(bytes);
byte[] bytes = ImageToByte(bImg);  // these should be the same bytes as went in

像这样设置它并单步执行代码以查看它的障碍。当您在ImageToByte() 中抓取字节时,字节可能需要编码。

而且,您不要只是将byte[] 直接设置为IMAGESthis.IMAGES.IMAGE,因为这不是Image 对象,而是byte[]。在不知道您的 IMAGES 模型构造及其属性类型的情况下,知道将什么设置为什么以及为什么设置有点模糊,但这似乎是一个坏主意,使您应该对函数调用进行过度复杂化根据需要,没有 getter-setter 和 IMAGES 模型。

【讨论】:

以上是关于BitMapImage 到字节和反转的主要内容,如果未能解决你的问题,请参考以下文章

从 System.Drawing.Bitmap 加载 WPF BitmapImage

Bitmap转换成BitmapImage

将BitmapImage转换为System.Windows.Media.Brush

图片Bitmap在本地的存储与读取 File

c# image转bitmap出现错误

WPF绑定BitMapImage