我们有一个图像处理 Windows 应用程序,我们使用主要工具将图像从 24/48 位图像转换为 8 位图像。
作为一个实验,我正在使用 MonoTouch 和 C# 将应用程序移植到 iPad,现在 LeadTools 组件与 Monotouch 不兼容。有什么我可以使用的替代品吗?如果不是,我如何将 24/48 位图像转换为 8 位?
我们有一个图像处理 Windows 应用程序,我们使用主要工具将图像从 24/48 位图像转换为 8 位图像。
作为一个实验,我正在使用 MonoTouch 和 C# 将应用程序移植到 iPad,现在 LeadTools 组件与 Monotouch 不兼容。有什么我可以使用的替代品吗?如果不是,我如何将 24/48 位图像转换为 8 位?
要使用 Apple 的成像工具,我将从这里开始:
将原始字节转换为平台支持的像素格式。请参阅有关支持的像素格式的 Quartz 2D 文档。
请注意,iOS 目前没有 24 或 48 位格式。但是,如果您的 24 位格式是每通道 8 位 (RGB),您可以添加 8 位忽略的 alpha。(Alpha 选项在 MonoTouch.CoreGraphics.CGImageAlphaInfo 中)
将原始字节转换为 CGImage。这是一个如何做到这一点的例子
var provider = new CGDataProvider(bytes, 0, bytes.Length);
int bitsPerComponent = 8;
int components = 4;
int height = bytes.Length / components / width;
int bitsPerPixel = components * bitsPerComponent;
int bytesPerRow = components * width; // Tip: When you create a bitmap graphics context, you’ll get the best performance if you make sure the data and bytesPerRow are 16-byte aligned.
bool shouldInterpolate = false;
var colorSpace = CGColorSpace.CreateDeviceRGB();
var cgImage = new CGImage(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow,
colorSpace, CGImageAlphaInfo.Last, provider,
null, shouldInterpolate, CGColorRenderingIntent.Default);
使用核心图像过滤器转换为单色
var mono = new CIColorMonochrome
{
Color = CIColor.FromRgb(1, 1, 1),
Intensity = 1.0f,
Image = CIImage.FromCGImage(image)
};
CIImage output = mono.OutputImage;
var context = CIContext.FromOptions(null);
var renderedImage = context.CreateCGImage(output, output.Extent);
最后,您可以通过绘制到根据您所需的参数构造的 CGBitmapContext 来检索该图像的原始字节。
我怀疑这个管道可以优化,但它是一个开始的地方。我很想听听你最终的结果。
我认为您最好的选择是对 LeadTools 库进行本机调用 - 我能想到的 C# 中的任何图像操作都将依赖于 GDI+ 和 Monotouch 不支持的 System.Drawing 命名空间等组件。
您可以通过创建 Binding 项目 - http://docs.xamarin.com/ios/advanced_topics/binding_objective-c_types从 monotouch 项目中调用本机 Objective-C 代码
这应该允许您以一种能够产生完全相同的图像/质量/格式的方式移植您的代码,而无需重新编写当前的转换代码。