0

我有一个裁剪图像(mainImage),允许用户在使用手指的基础上进行绘制。屏幕 A. 上的红色锯齿形显示手指绘制的部分。现在,使用下面的代码,新绘制的图像上下文(红色锯齿形)被推入与裁剪图像相同的边界,我最终得到一个扭曲的锯齿形(屏幕截图 B.)。您可以看到红色锯齿形是如何被推入裁剪的边界(mainImage)的。

我想要实现的是一个图像,它结合了 mainImage 和 drawImage 的两个上下文,而不会扭曲任何一张照片的比例。因此,只有与 mainImage 重叠的红色之字形部分将在新的上下文中绘制,如屏幕截图 C 所示。(我想要的结果的 photoshopped 图像)。现在,commitDrawingWithOpacity: 方法的结果是屏幕截图 B。我想要屏幕截图 C 的结果。

我已经尝试过 CGContextClipToRect、CGContextClipToMask,还尝试为绘图图像创建一个新的矩形,但到目前为止还没有成功。我已经在这个问题上困扰了将近一个月(自学),这是我在将我的应用程序提交给苹果之前需要做的最后一件事。因此,我们将不胜感激任何帮助。这是我正在使用的代码的链接https://github.com/dblapps/DAScratchPad

这是每个的大小:

drawImage.size = (width=320, height=568) // iPhone 5 屏幕尺寸

mainImage.size = (width=260, height=800) // 裁剪图像的大小

我的 imageView 设置为宽高比。

- (void) commitDrawingWithOpacity:(CGFloat)opacity {
    UIGraphicsBeginImageContext(mainImage.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextScaleCTM(ctx, 1.0f, -1.0f);
    CGContextTranslateCTM(ctx, 0.0f, -mainImage.size.height);

    CGRect rect = CGRectMake(0.0f, 0.0f, mainImage.size.width, mainImage.size.height);

    if (mainImage != nil) {
        CGContextDrawImage(ctx, rect, mainImage.CGImage);
    }

    CGContextSetAlpha(ctx, opacity);
    CGContextDrawImage(ctx, rect, drawImage.CGImage);
    mainImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.layer.contents = (id)mainImage.CGImage;
    drawLayer.contents = nil;
    drawImage = nil;
}

使用函数 AVMakeRectWithAspectRatioInsideRect 我已经能够为我的 mainImage 获得正确的大小比,但仍然没有让任何事情正常工作。

在此处输入图像描述

下面是我试图达到的结果的 Photoshop 截图。屏幕截图 B(上图)是我目前的代码所得到的。

在此处输入图像描述

4

2 回答 2

0

您正在drawImage使用 的比例绘制,mainImage因此它被扭曲了。您应该保持比例drawImage并正确定位它。这是您调整的潜在起点 - 很难从您的问题中准确说出您想要实现的目标:

CGRect drawImageRect = (CGRect){
  .origin = {
    .x = -((drawImage.size.width - mainImage.size.width)   / 2),
    .y = -((drawImage.size.height - mainImage.size.height) / 2),
  },
  .size = drawImage.size,
};

此矩形使用原始大小,然后调整绘制图像的原点

于 2014-03-23T19:08:53.930 回答
0

对我来说,我需要利用这两个函数:AVMakeRectWithAspectRatioInsideRect & CGImageCreateWithImageInRect 来获得想要的结果。我的问题是我的 mainImage 和 drawImage 之间的纵横比差异。所以 AVMakeRectWithAspectRatioInsideRect 给了我一个新的矩形,它具有正确的大小比例和我的 mainImage 的原点。之后,我使用 CGImageCreateWithImageInRect 将 [drawImage CGImage] 放入新的矩形并 Presto!我的 drawImage 和 mainImage 创建了一个具有完全相同纵横比的新上下文。不再有图像失真或歪斜。工作代码发布在下面。

- (void) commitDrawingWithOpacity:(CGFloat)opacity {

    CGRect drawRect = AVMakeRectWithAspectRatioInsideRect(mainImage.size, self.frame);

    UIGraphicsBeginImageContext(mainImage.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextScaleCTM(ctx, 1.0f, -1.0f);
    CGContextTranslateCTM(ctx, 0.0f, -mainImage.size.height);

    CGRect rect = CGRectMake(0.0f, 0.0f, mainImage.size.width, mainImage.size.height);

    if (mainImage != nil) {
        CGContextDrawImage(ctx, rect, mainImage.CGImage);
    }

    CGImageRef imageRef = CGImageCreateWithImageInRect([drawImage CGImage], drawRect);

    CGContextSetAlpha(ctx, opacity);
    CGContextDrawImage(ctx, rect, imageRef);

    mainImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.layer.contents = (id)mainImage.CGImage;
    drawLayer.contents = nil;
    drawImage = nil;
}
于 2014-03-24T05:29:25.907 回答