使用CGImageCreateWithImageInRect、UIImage和UIImagePickerController的好方法

5
我正在尝试做一些理论上应该很简单的事情,但我已经困扰了好几天。我正在尝试从屏幕叠加层中获取触摸事件,捕获图像,并在手指触摸的周围裁剪图像的一部分。
现在我的所有代码都很好,叠加层、事件、裁剪等都没问题... 但是,我似乎无法让触摸事件的坐标系统与UIImage的坐标系统匹配。我已经阅读了所有可以找到的文档,但似乎无法解决这个问题。
我的主要问题是,在使用CGImageCreateWithImageInRect时,我需要考虑UIImageOrientation吗?还是Quartz会自动处理?我之所以问这个问题,是因为我有一个非常简单的例程,可以很好地裁剪图像,但裁剪后的图像似乎永远不在我按下手指的位置?
大部分程序如下:
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
 UIImage *image = =[info objectForKey:@"UIImagePickerControllerOriginalImage"];
 float scaleX = image.size.width / SCREEN_WIDTH;
 float scaleY = image.size.height / SCREEN_HEIGHT;
        //lastTouch is saved from touchesBegan method
 float x = (lastTouch.x * scaleX) - (CROP_WIDTH/2);
 float y = (lastTouch.y * scaleY) - (CROP_WIDTH/2);
 if(x < 0) x = 0.0;
 if(y < 0) y = 0.0;
        CGRect cropArea = CGRectMake(x, y, CROP_WIDTH, CROP_WIDTH);
 CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropArea);
 UIImage *swatch = [UIImage imageWithCGImage:imageRef];

        //at this point I'm just writing the images to the photo album to see if
        //my crop is lining up with my touch
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
        UIImageWriteToSavedPhotosAlbum(swatch, nil, nil, nil);
}

所以问题在于,我的裁剪区域(在照片相册中查看)从未与我按下的实际区域相匹配(总是照片的其他随机部分),这让我认为我的坐标系统出了问题。

即使只是指向一些我尚未发现的文档,任何提示都将不胜感激。

谢谢 Adam

1个回答

0
你必须时刻记住,CoreGraphics和UIKit之间的默认坐标系是不同的。虽然UIKit的原点位于窗口的左上角,但CoreGraphics将此点设置在左下角。我认为这可能足以让你走上正确的轨道,但只是为了重申一下:
你可以使用以下代码来反转或翻转你的坐标系。
CGContextTranslateCTM(graphicsContext, 0.0, drawingRect.size.height);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);

还要查看在iOS绘图和打印指南中的翻转默认坐标系


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接