介绍 C# 的便携式通用图像库






4.96/5 (22投票s)
C# 的便携式通用图像库
![]() |
.NET 没有提供真正可移植的图像格式。System.Drawing.Bitmap 没有提供泛型接口,这会强制执行编译时约束。EmguCV 的泛型图像提供了泛型接口,但与 OpenCV 紧密耦合,并且没有提供非泛型接口,后者具有许多算法所需的基本数据操作方法。所有提到的图像类型都没有提供统一的互操作性,这在混合来自不同库的图像处理算法时是必需的。
DotImaging 框架的方法是提供颜色类型,该类型被表示托管图像的二维数组使用。 这样,就可以利用已知的内置数组类型,该类型为许多可以编写为扩展的图像处理算法提供了基础。 与其他图像类型的互操作性通过扩展程序集(例如 DotImaging.BitmapInterop)实现。 该库吸引人的原因是以下几点
-
利用现有的 .NET 结构
主要的图像处理结构是内置的 .NET 数组(例如 Bgr<byte>[,] - 一个 Bgr 8 位图像) -
可移植 - 专为 Web 设计
它不与任何特定于平台的 API 相关联,因此可以简单地进行多平台使用。 -
轻量级(没有第三方依赖项),但功能强大
没有第三方依赖项,并且包很小。 -
非常简单,您不需要帮助文件
在 NuGet 包安装后,会显示相应的 read-me 文件,其中提供了简短的示例,演示了您可以使用它做什么。
组件/NuGet 包
DotImaging.GenericImage
.NET 图像数组扩展。 颜色和深度转换。 用于快速像素操作的纤薄非托管结构。
//convert to grayscale and flip
Bgr<byte>[,] image = ImageIO.LoadColor("sample.jpg").Clone();
Gray<byte>[,] grayIm = image.ToGray()
.Flip(FlipDirection.Horizontal);
DotImaging.IO
用于 IO 图像访问的统一 API(相机、文件、图像目录)。 可移植的图像加载/保存。
//create camera (file or image-directory) capture
var reader = new CameraCapture();
reader.Open();
//read single frame
var frame = reader.ReadAs<Bgr<byte>>();
reader.Close();
DotImaging.Linq
2D 数组 Linq 扩展
//create a managed image
Bgr<byte>[,] image = ...;
//get the modified blue channel
var modifiedImage = image.AsEnumerable()
.Select(x => x.B / 2)
.ToArray2D(image.Size());
DotImaging.Drawing
.NET 图像绘制数组扩展。
//create a managed image
var image = new Bgr<byte>[480, 640];
//draw something
image.Draw(new Rectangle(50, 50, 200, 100), Bgr<byte>.Red, -1);
image.Draw(new Circle(50, 50, 25), Bgr<byte>.Blue, 5);
DotImaging.BitmapInterop
.NET 数组和 Bitmap 之间的互操作性扩展。
var image = new Gray<byte>[240, 320];
var bmp = image.ToBitmap(); //to Bitmap
var imageFromBmp = bmp.ToArray() as Bgr<byte>[,]; //from Bitmap
DotImaging.Primitives2D
可移植的 2D 绘图图元(点、大小、矩形...)
快速像素操作
有时,通过内置 2D .NET 数组的像素访问速度是不够的。 可以通过使用不安全的代码来消除边界检查。 此外,通过将图像表示形式作为非托管指针和大小,可以将托管数组轻松转换为各种第三方图像结构格式。 内置的 Image<TColor> 提供了非托管像素访问。 下面显示了一个示例用法
Bgr<byte>[,] image = ... using(Image<Bgr<byte>> uIm = image.Lock()) { Bgr8* ptr = (Bgr8*)uIm.ImageData; ptr->B = 8; //set the image[0, 0].B = 8; }
反向转换获取数据副本,可以这样做
Image<Bgr<byte>> uIm = ...
Bgr<byte>[,] image = uIm.Clone();
非托管图像还支持 OpenCV 的 IplImage 互操作性,这在使用某些 OpenCV 的函数时直接或通过 EmguCV 库时可能很有用。
Image<Bgr<byte>> uIm = ...
IplImage iplImage = uIm.AsOpenCvImage();
非托管类还实现了非泛型接口 IImage,该接口可以传递泛型类型不可用或不希望使用的泛型图像实例。 该接口本身包含许多扩展,因此即使是非托管非泛型表示形式也很有用。 请记住,非托管类主要用于互操作性和快速像素访问。 .NET 内置数组是主要的图像处理对象。
结论
本文介绍了可移植的通用图像库,该库提供了与其他库的图像格式的互操作性:EmguCV、OpenCV 和标准 .NET 类型(Bitmap、BitmapData、2D 和 3D 数组)。 该框架是 Accord.NET Extensions 框架的基础 - 用于图像处理和计算机视觉的框架。 DotImaging 专注于 .NET 本机数组作为主要的图像处理对象,通过扩展提供可扩展性支持,并提供统一的平台抽象图像 IO API,所以请不要忘记看一看 :)。
历史
- 2014 年 10 月 13 日 - 发布第一个版本
- 2015 年 4 月 28 日 - 更新
- 2015 年 9 月 15 日 - 重大修订