【问题标题】:Mask a UIImage that has been moved/scaled屏蔽已移动/缩放的 UIImage
【发布时间】:2013-02-26 18:09:18
【问题描述】:

我可以像这样完成屏蔽:

CGAffineTransform t = self.imageForEditing.transform;

    NSLog(@"x offset: %f, y offset: %f", self.imageForEditing.frame.origin.x, self.imageForEditing.frame.origin.y);
    NSLog(@"scale: %f", sqrt(t.a * t.a + t.c * t.c));

    UIImage *maskImage = [UIImage imageNamed:@"faceMask"];
    UIImage *colorsImage = [self.imageForEditing.image imageRotatedByDegrees:180];

    CGImageRef maskRef = maskImage.CGImage;
    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                             CGImageGetHeight(maskRef),
                                             CGImageGetBitsPerComponent(maskRef),
                                             CGImageGetBitsPerPixel(maskRef),
                                             CGImageGetBytesPerRow(maskRef),
                                             CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef maskedRef = CGImageCreateWithMask(colorsImage.CGImage, imageMask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedRef];

您可以在日志语句中看到我可以访问原始图像已移动和/或缩放的程度。如何应用此信息以便新的蒙版图像将其考虑在内?想象一下,面具只是屏幕中间的一个圆形切口。 self.imageForEditing (a UIImageView) 可以移动。创建新图像时,它应该只是通过切口可见的部分。上面的代码有效,但没有考虑底层图像的移动/缩放。

编辑:我认为根据图像视图的当前状态(self.imageForEditing)创建一个新图像可能更容易。它位于一个容器 self.editContainer 中。那么如何才能根据 self.editContainer 中包含的当前像素创建一个新图像呢?

【问题讨论】:

  • colorsImage.CGImage 仍然是未修改的原始格式。您必须先将该图像重绘成一个新的缩放和转换的 CGImage,然后再做蒙版。
  • @Liron 谢谢。你能举个例子吗?我已经尝试过 CGImageCreateWithImageInRect 但我没有得到好的结果。
  • 我不确定我能否给出一个确切的例子,但让我更好地理解你在做什么。哪个图像正在被缩放和转换?蒙版还是被蒙版的图像?
  • 这是被蒙版的图像。我想我可以得到带有类别的缩放图像,例如 UIImage *scaled = [self.imageForEditing.image imageScaledToSize:self.imageForEditing.frame.size];
  • 查看我的编辑可能更容易解决的问题。

标签: ios uiimage transform masking


【解决方案1】:

最后通过将容器视图渲染为图像来解决这个问题,然后使用我发现的 UIImage 类别来修剪透明像素。如果它对某人有帮助:

关于容器的uiview:

    UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);

    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2011-07-28
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多