【问题标题】:Cropping CIImage with CICrop isn't working properly使用 CICrop 裁剪 CIImage 无法正常工作
【发布时间】:2012-03-24 23:12:22
【问题描述】:

我在裁剪图像时遇到问题。对我来说,CICrop 过滤器无法正常工作。如果我的 CIVector x 和 y(原点)为 0,一切正常(图像从左下角裁剪),图像被我的矩形宽度和高度裁剪,但如果 CIVector 原点(x 和 y)在我的裁剪中不是 0图像变成了空间(因为无论原点(x 和 y)是什么,CICrop 过滤器都会从左下角裁剪)。

我正在用矩形裁剪 CIImage,来源

CIVector *cropRect =[CIVector vectorWithX:150 Y:150 Z: 300 W: 300];

CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"];   

[cropFilter setValue:myCIImage forKey:@"inputImage"];
[cropFilter setValue:cropRect forKey:@"inputRectangle"];

CIImage *croppedImage = [cropFilter valueForKey:@"outputImage"];

使用 CIVector X 150 和 Y 150 输出图像:(为了清楚起见,我画了边框)

使用 CIVector X 0 和 Y 0 输出图像:

原图:

我做错了什么?还是应该这样做?

【问题讨论】:

    标签: macos cocoa crop


    【解决方案1】:

    您确定输出图像是您期望的尺寸吗?你是如何绘制输出图像的?

    CICrop 过滤器不会减小原始图像的大小,它只是将您不想要的内容屏蔽掉。

    要获得您想要的结果,您可能只需要这样做:

    [image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(150, 150, 300, 300) operation:NSCompositeSourceOver fraction:1.0];
    

    如果您想要一个实际的 CIImage 作为输出而不是仅仅绘制它,只需这样做:

    CIImage* croppedImage = [image imageByCroppingToRect:CGRectMake(150, 150, 300, 300)];
    
    //you also need to translate the origin   
    CIFilter* transform = [CIFilter filterWithName:@"CIAffineTransform"];
    NSAffineTransform* affineTransform = [NSAffineTransform transform];
    [affineTransform translateXBy:-150.0 yBy:-150.0];
    [transform setValue:affineTransform forKey:@"inputTransform"];
    [transform setValue:croppedImage forKey:@"inputImage"];
    CIImage* transformedImage = [transform valueForKey:@"outputImage"];
    

    【讨论】:

    • 谢谢罗伯!这对绘制图像很有用,但是如果我需要裁剪 CIImage,而不是用于绘图,而是用于 CIImage,该怎么做。转换为 NSImage lockfocus -> 绘制图像 -> unlockfocus -> 转换为 CIImage。嗯,我认为这不好,也许您可​​以建议我如何获得完全裁剪的 CIImage?再次非常感谢您的帮助 Rob。 +1
    • 我在答案中添加了imageByCroppingToRect: 方法的示例,它将实现您想要的。
    • 嗯..这对我不起作用,同样的问题。看看我的问题,我在底部添加了更新代码。感谢罗布的耐心。
    • 其实图片是正确的,只是生成的图片的extent是{150,150,300,300}而不是{0,0,300,300}。我在我的答案中添加了一个转换来解决这个问题。我在这里测试了它,它似乎工作正常。
    • 你是对的 Rob。非常感谢,现在可以正常使用了。
    【解决方案2】:

    重要的是要注意视图的坐标系是左上角,而 CIImage 是左下角。如果您在进行这些变换时没有抓住它,这会让您发疯!另一篇文章描述了一种单向转换:Changing CGrect value to user coordinate system

    【讨论】:

    • 这让我怀疑自己的理智......谢谢!
    【解决方案3】:

    这就是CICrop 的工作原理——它裁剪您指定的矩形,而未裁剪的区域变得透明。如果您打印extent,您会看到它仍然是原来的矩形。

    按照建议,您可以进行翻译。这现在只是 1 行,在 Swift 5 中:

    let newImage = myCIImage.transformed(by: CGAffineTransform(translationX: -150, y: -150)
    

    【讨论】:

      猜你喜欢
      • 2012-07-04
      • 2015-03-30
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多