我们有一个图像处理窗口应用程序,我们使用引导工具将24/48位图像转换为8位图像。
作为一项实验,我使用MonoTouch和C#将应用程序移植到iPad,现在LeadTools组件与Monotouch不兼容。我可以使用任何替代品吗?如果不能如何将24/48位图像转换为8位?
答案 0 :(得分:3)
在这里使用Apple的成像工具是我要开始的地方:
将原始字节转换为平台支持的像素格式。请参阅supported pixel formats上的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);
使用Core Image Filter转换为单色
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来检索该图像的原始字节。
我怀疑这条管道可以优化,但它是一个开始的地方。我很想知道你最终会得到什么。
答案 1 :(得分:0)
我认为您最好的选择是对LeadTools库进行本机调用 - 我认为C#中的任何图像处理都将依赖于GDI +和System.Drawing命名空间等组件,而monotouch不支持
您可以通过创建Binding项目从您的monotouch项目调用本机Objective-C代码 - http://docs.xamarin.com/ios/advanced_topics/binding_objective-c_types
这应该允许您以一种能够生成完全相同的图像/质量/格式的方式移植代码,而无需重新编写当前的转换代码。