我们有一个图像处理窗口应用程序,在该应用程序中,我们使用领先的工具将图像从24/48位图像转换为8位图像。
作为一个实验,我正在使用MonoTouch和C#将应用程序移植到iPad上,现在LeadTools组件与MonoTouch不兼容。有什么替代品我可以用吗?如果不是,我如何将24/48位图像转换为8位?
要使用苹果的成像工具,我从这里开始:
-
将原始字节转换为平台支持的像素格式。有关支持的像素格式,请参阅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+和System.Drawing命名空间这样的组件,而monotouch不支持这些组件。
你可以通过创建一个绑定项目来从你的单点触控项目中调用原生objective-C代码http://docs.xamarin.com/ios/advanced_topics/binding_objective-c_types
这应该允许您以一种可以产生完全相同的图像/质量/格式的方式移植代码,而无需重新修改当前的转换代码。