将位图图像转换为字节数组。

3

我正在尝试将位图图像转换为字节数组。我使用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文件。但是当我打开zip文件并双击图像时,有些图像无法显示。我认为问题出在读取图像字节上。我不知道哪里出错了?我的代码有问题吗?


你可以尝试使用 ms.ToArray() 而不是 ms.GetBuffer() 吗? - Kevin Gosse
@KooKiz 感谢您的回复。我已经尝试过了,但它并没有起作用。 - user2575950
顺便提一下,您不必使用字节数组。在执行 seek 操作后,直接调用 ms.CopyTo(stream); 即可。这不会解决您的问题,但它会使您的代码更易于阅读并节省一些 RAM。而且,seek 操作应该在 ms 上调用,而不是在 stream 上调用。 - Kevin Gosse
2个回答

3
也许你可以尝试以下代码。我知道这段代码保留了图像,所以如果你使用它没有成功,可能存在其他问题。
    // 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 Phone上不支持System.Drawing。 - user2575950
抱歉,这里的答案有用吗?https://dev59.com/1G445IYBdhLWcg3ws8Zp?rq=1 - stevepkr84
它给我一个错误,“ConvertTo在基础TypeConverter中未实现。” - user2575950
我已经添加了这段代码:ImageSourceConverter converter = new ImageSourceConverter();byte[] bytes = (byte[])converter.ConvertTo(ImgCollection[i], typeof(byte[])); 其中ImgCollection是“List<BitmapImage>”对象。 - user2575950

0

不需要将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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接