【问题标题】:Image to byte[], Convert and ConvertBack图像到 byte[]、Convert 和 ConvertBack
【发布时间】:2012-04-06 01:45:01
【问题描述】:

我有一项服务可以将存储在网站上的图像转换为字节数组

                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("URLTOIMAGE");
                myRequest.Method = "GET";
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                Bitmap bmp = new Bitmap(myResponse.GetResponseStream());
                myResponse.Close();
                ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);

此代码返回我存储在数据库 (SQL Azure) 中的字节数组。在我的 Windows Phone 应用程序中,我尝试转换此字节数组以将其显示在我的页面上。

public class BytesToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        BitmapImage empImage = new BitmapImage();
        empImage.SetSource(new MemoryStream((Byte[])value));
        return empImage;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                                System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

字节数组被应用程序很好地接收,但是当我尝试执行 SetSource 时抛出异常。

empImage.SetSource(new MemoryStream((Byte[])value));
=> "Exception was unhandled", The request is not supported

你能帮帮我吗?谢谢

【问题讨论】:

  • 你要加载什么类型的图片?
  • 这是 JPEG => byte[] 和 byte[] 到 BitmapImage(用于 Imagesource)

标签: c# image windows-phone-7


【解决方案1】:

此代码有效:

public class BytesToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        MemoryStream stream = new MemoryStream((Byte[])value);
        WriteableBitmap bmp = new WriteableBitmap(173, 173);
        bmp.LoadJpeg(stream);
        return bmp;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                                System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

谢谢大家:)

【讨论】:

【解决方案2】:

这些问题已经在 stackoverflow 上得到解答
将图像转换为字节 [] 尝试 this
并为 byte[] 图像尝试this

【讨论】:

  • 我使用相同的代码(使用 memeorystream),但它不起作用。
【解决方案3】:
private ImageSource GetPhoto(byte[] bytearr)
{
   if (bytearr != null)
   {
      BitmapImage image = new BitmapImage();

      InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
      ms.AsStreamForWrite().Write(bytearr, 0, bytearr.Length);
      ms.Seek(0);

      image.SetSource(ms);
      ImageSource src = image;

      return src;
   }
   else
      return null;
}

【讨论】:

    【解决方案4】:

    对于我的 UWP 应用,我使用以下 IValueConverter 将字节数组转换为 <Image Source={Binding} /> 的可绑定对象

    internal class ByteImageSourceConverter : IValueConverter
    {
        object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
        {
            if (value == null)
                return null;
            return ByteToImage((byte[])value);
        }
    
        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    
        static ImageSource ByteToImage(byte[] imageBytes)
        {
            BitmapImage image = new BitmapImage();
            image.SetSource(imageBytes.ConvertToInMemoryRandomAcessStream());
            ImageSource src = image;
            return src;
        }
    }
    
    internal static InMemoryRandomAccessStream ConvertToInMemoryRandomAcessStream(this byte[] arr)
    {
        var randomAccessStream = new InMemoryRandomAccessStream();
        randomAccessStream.WriteAsync(arr.AsBuffer());
        randomAccessStream.Seek(0);
        return randomAccessStream;
    }
    

    对不起,同步函数中的 WriteAsync。出于这篇文章的目的,我没有时间解决这个问题,但它是这样工作的:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2018-06-16
      相关资源
      最近更新 更多