【问题标题】:Convert bitmapimage into byte array将位图图像转换为字节数组
【发布时间】:2013-07-29 06:42:08
【问题描述】:

我正在尝试将位图图像转换为 字节数组。我使用 MediaLibrary 类选择了所有图像并将其添加到位图图像列表中。这是我的代码

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (!store.DirectoryExists("ImagesZipFolder"))
            {
                store.CreateDirectory("ImagesZipFolder");
                for (int i = 0; i < imgname.Count(); i++)
                {
                    using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(@"ImagesZipFolder\" + imgname[i], System.IO.FileMode.CreateNew, store))
                    {
                            byte[] bytes = null;
                            using (MemoryStream ms = new MemoryStream())
                            {
                                WriteableBitmap wBitmap = new WriteableBitmap(ImgCollection[i]);
                                wBitmap.SaveJpeg(ms, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
                                stream.Seek(0, SeekOrigin.Begin);
                                bytes = ms.GetBuffer();
                                stream.Write(bytes, 0, bytes.Length);
                            }
                    //    byte[] bytes = Encoding.UTF8.GetBytes(imgname[i]);//new byte[ImgCollection[i].PixelWidth * ImgCollection[i].PixelHeight * 4];                           
                    //    stream.Write(bytes, 0, bytes.Length);
                    }
                }
            }
            else {
                directory = true;
            }
          }

基本上我想要做的是,从设备中选择所有图像或照片并创建这些图像的 zip 文件。我成功地创建了图像的 zip 文件。当我提取该文件时,有一些图像,但问题是当我双击图像时,我看不到该图像。我认为问题在于读取图像的字节。我不明白怎么了?我的代码正确吗?

【问题讨论】:

  • 你能用ms.ToArray()代替ms.GetBuffer()吗?
  • @KooKiz 感谢您的回复。我试过了,但它不起作用
  • 附带说明,您不必使用字节数组。搜索完后直接调用ms.CopyTo(stream);。它不会解决您的问题,但它会使您的代码更易于阅读并节省一些 RAM。并且搜索应该在 ms 上调用,而不是在流上。

标签: c# windows-phone-7 windows-phone-8 isolatedstorage


【解决方案1】:

无需将WriteableBitmap 保存到MemoryStream,然后再将其复制到IsolatedStorageFileStream。只需将位图直接保存到 IsolatedStorageFileStream。

using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(@"ImagesZipFolder\" + imgname[i], System.IO.FileMode.CreateNew, store))
{
    WriteableBitmap wBitmap = new WriteableBitmap(ImgCollection[i]);
    wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
}

这也可以让您节省内存。如果你真的想节省内存,你可以重用 WriteableBitmap。

【讨论】:

    【解决方案2】:

    也许您可以尝试以下方法。我知道这段代码维护了图像,所以如果你没有运气使用它,你可能会遇到不同的问题。

        // Convert the new image to a byte[]
        ImageConverter converter = new ImageConverter();
        byte[] newBA = (byte[])converter.ConvertTo(newImage, typeof(byte[]));
    

    ImageConverter 属于 System.Drawing 命名空间。


    更新:

    http://msdn.microsoft.com/en-GB/library/system.windows.media.imagesourceconverter.convertto.aspx

    您应该可以使用它来代替我建议的 System.Drawing 类型。

    【讨论】:

    • 感谢您的回复。我认为 Windows 手机不支持 System.Drawing
    • 抱歉。这里的答案有用吗? stackoverflow.com/questions/4732807/…
    • 它给了我一个错误“ConvertTo 未在基本 TypeConverter 中实现。”
    • 我已添加此代码 ImageSourceConverter converter = new ImageSourceConverter();byte[] bytes = (byte[])converter.ConvertTo(ImgCollection[i], typeof(byte[]));其中 ImgCollection 是 "List" 的对象
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多