zoukankan      html  css  js  c++  java
  • WPF 位图处理相关类

    位图的存储方式

    开始之前,先了解下位图的存储方式
    位图的像素都分配有特定的位置和颜色值。每个像素的颜色信息由RGB组合或者灰度值表示,根据位深度,可将位图分为1、4、8、16、24及32位图像等。每个像素使用的信息位数越多,可用的颜色就越多,颜色表现就越逼真,相应的数据量越大。位图的深度就是每个像素用多少位表示,详情如下:
    8位:  2^8 = 2^2(B) 2^3(G) 2^3(R) = 256  (256色)    可以总共显示256种颜色
    16位:2^16 = 2^5(B) 2^6(G) 2^5(R) =  65536    可以总共显示65536种颜色
    24位:2^24 = 2^8(B) 2^8(G) 2^8(R) =  16777216    可以总共显示16777216种颜色
    32位:Alpha透明度 + 24位
    在winform时代,处理位图使用的是System.Drawing命名空间,wpf之后新加了一个命名空间做位图处理:System.Windows.Media.Imaging,该namespace里提供一些类型,这些类型可用于对位图图像进行编码和解码。

    显示图像

    最简单的位图处理,显示一个图片到控件上,使用Image控件加载图像文件成BitmapImage:

    bitmapImage.BeginInit();
    bitmapImage.UriSource = new Uri(@"D:xxx.jpg");
    bitmapImage.EndInit();
    

    Image控件的Source属性就是BitmapImage类型
    在msdn上对BitmapImage的介绍如下:

    提供一个专用的 BitmapSource(继承自System.Windows.Media.Imaging.BitmapSource)
    已使用 Extensible Application Markup Language (XAML) 针对加载图像进行了优化。

    这里我们暂时先不管BitmapImage,先看看他的父类BitmapSource

    System.Windows.Media.Imaging.BitmapSource

    表示在一定大小和分辨率下的单个恒定像素集。也就是说BitmapSource代表一个位图图像文件。
    BitmapSource是Windows Presentation Foundation (WPF)图像处理管道的基本构建基块, 从概念上讲, 以一定大小和分辨率来表示一组固定的像素。

    也就是说,BitmapSource就代表一系列像素组成的位图图像,该类是一系列位图处理类的基类,该类有如下子类:
    InteropBitmap
    BitmapFrame
    BitmapImage
    CachedBitmap
    ColorConvertedBitmap
    CroppedBitmap
    FormatConvertedBitmap
    RenderTargetBitmap
    TransformedBitmap
    WriteableBitmap

    msdn为我们提供了一个创建BitmapSource的实例

    // Define parameters used to create the BitmapSource.
    PixelFormat pf = PixelFormats.Bgr32;
    int width = 200;
    int height = 200;
    int rawStride = (width * pf.BitsPerPixel + 7) / 8;
    byte[] rawImage = new byte[rawStride * height];
    
    // Initialize the image with data.使用随机数填充像素
    Random value = new Random();
    value.NextBytes(rawImage);
    
    // Create a BitmapSource.
    BitmapSource bitmap = BitmapSource.Create(width, height,
        96, 96, pf, null,
        rawImage, rawStride);
    
    // Create an image element;
    Image myImage = new Image();
    myImage.Width = 200;
    // Set image source.
    myImage.Source = bitmap;
    

    很明显,在上面的例子中BitmapSource中每一个像素是占32位的(PixelFormats.Bgr32 也就是sRGB)。

    再谈BitmapImage

    继承自BitmapSource,新加了四个方法分别是:BeginInit()、EndInit()、Clone()、CloneCurrentValue()
    该类主要功能是可以从图像文件获得BitmapSource,使用BeginInit和EndInit()

    // Create the image element.
    Image simpleImage = new Image();    
    simpleImage.Width = 200;
    simpleImage.Margin = new Thickness(5);
    
    // Create source.
    BitmapImage bi = new BitmapImage();
    // BitmapImage.UriSource must be in a BeginInit/EndInit block.
    bi.BeginInit();
    bi.UriSource = new Uri(@"/sampleImages/cherries_larger.jpg",UriKind.RelativeOrAbsolute);
    bi.EndInit();
    // Set the image source.
    simpleImage.Source = bi;
    

    另外他还有个StreamSource属性可以从流直接获取图像。

    RenderTargetBitmap

    用于转换System.Windows.Media.visual对象(所有wpf控件的基类)成位图
    只有两个方法Clear()和void Render(Visual visual)
    Render就是渲染Visual对象(wpf控件都是Visual的子类)成位图,截图软件控件的时候使用该类

    BitmapFrame

    根据给定的url或者BitmapSoutce或者stream创建新的BitmapFrame
    表示一帧图像,在BitmapEncoder和BitmapDecoder中都有List的集合来表示很多帧图像数据。
    继承自BitmapSource,只有一个方法Create()该函数返回值也是BitmapFrame

    TransformedBitmap

    缩放和旋转BitmapSource

    BitmapEncoder

    抽象类,将 BitmapFrame对象的集合编码为图像流
    一个重要的方法Save(Stream st),将位图图像编码为指定的 Stream。处理完图像要保存成文件或者流一定会用到这个类。
    派生(分格式编码)
    BmpBitmapEncoder
    GifBitmapEncoder
    JpegBitmapEncoder
    PngBitmapEncoder
    TiffBitmapEncoder
    WmpBitmapEncoder
    有一个List Frames的集合,集合的每一个对象是一个BitmapFrame对象,表示一帧图像

    图像与字节数组转换的思路

    文件字节数组:文件的byte形式。
    Pixel字节数组:数组的每个元素代表一个像素,可以存储8位256色的像素。
    以上两个字节数组是不一样的。
    如果是图像文件,那么使用File.ReadAllBits()方法可以得到该文件的bytes数组。如果是BitmapSource类型或者其子类的结构可以考虑使用MemoryStream,
    MemoryStream类有一个ToArray()方法,msdn是这样介绍的:

    将流内容写入字节数组,而与 Position 属性无关。
    位图图像转换成字节数组就是要用到这个方法,思路就是用MemoryStream做一次中间转换,先把位图写入到MemoryStream中然后调用ToArray()方法。
    注意,这里得到的是文件的byte数组,并不是上文介绍BitmapSource中用到的像素数组,要得到BitmapSource的像素数组可以使用BItmapSource.CopyPixels()方法。

    位图转成base64的思路

    Convert有个方法:Convert.ToBase64String(),核心参数就是byte[] (从文件读取File.ReadAllBytes,或者从流读取MemoryStream.ToArray),所以思路就是将位图转换成byte[]然后使用Convert.ToBase64String()即可。

  • 相关阅读:
    2015-05-06前端开发总结
    深入了解 Flexbox 伸缩盒模型
    Sublime text3 快捷方式(windows平台)
    移动web最简洁的滑动效果Swipe JS(适合初学者)
    谈响应式web设计代码实现
    经验分享:多屏复杂动画CSS技巧三则
    css3 animation动画效果解析
    移动H5前端性能优化指南
    php codeigniter (CI) oracle 数据库配置-宋正河整理
    jquery图片裁切+PHP文件上传
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/11757251.html
Copyright © 2011-2022 走看看