none
关于在 image 中显示 byte[] 像素数据? RRS feed

  • 问题

  • 如何让像素数据在WPF的 image 图像控件显示出来?

    像素数据byte[]如下:

          byte[] image = new byte[307200];
          for (int i = 0; i < 307200; i++)
          {
            image[i] = 156;
          }

    2014年7月6日 14:06

答案

  • 你好。

    可以将byte[] 转换为 MemoryStream,进而转换为BitmapImage,然后由Image控件显示出来。但是要保证byte[] 是一个可以正常显示的数据。

    下面提供一下byte[] 和 BitmapImage 之间互相转换的方法:

    byte[] -> BitmapImage:

    private BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            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;
    }
    BitmapImage -> byte[]:
    public byte[] getJPGFromImageControl(BitmapImage imageC)
    {
        MemoryStream memStream = new MemoryStream();
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(imageC));
        encoder.Save(memStream);
        return memStream.GetBuffer();
    }
    为了测试方便,可以使用一张现有图片,转换为byte[],然后由LoadImage方法转换后显示。

    2014年7月7日 2:08
  • 可以通过把现有图片通过getJPGFromImageControl方法转换为byte[],存储下来。

    然后使用这个byte[] 数据,通过LoadImage 方法再转换为BitmapImage。

    2014年7月7日 4:59

全部回复

  • 你好。

    可以将byte[] 转换为 MemoryStream,进而转换为BitmapImage,然后由Image控件显示出来。但是要保证byte[] 是一个可以正常显示的数据。

    下面提供一下byte[] 和 BitmapImage 之间互相转换的方法:

    byte[] -> BitmapImage:

    private BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            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;
    }
    BitmapImage -> byte[]:
    public byte[] getJPGFromImageControl(BitmapImage imageC)
    {
        MemoryStream memStream = new MemoryStream();
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(imageC));
        encoder.Save(memStream);
        return memStream.GetBuffer();
    }
    为了测试方便,可以使用一张现有图片,转换为byte[],然后由LoadImage方法转换后显示。

    2014年7月7日 2:08
  • 但是如果不使用现有图片的话,怎样将我的像素数据显示在image呢?或者使用现有图片的话又怎样读写图片的像素值呢?
    2014年7月7日 3:09
  • 可以通过把现有图片通过getJPGFromImageControl方法转换为byte[],存储下来。

    然后使用这个byte[] 数据,通过LoadImage 方法再转换为BitmapImage。

    2014年7月7日 4:59