使用CGImageCreateWithImageInRect,UIImage和UIImagePickerController问题的好方法

时间:2010-10-06 08:50:48

标签: iphone uiimage uiimagepickercontroller

我正在尝试做一些理论上应该很简单的事情,但我现在已经追了好几天了。我正试图从屏幕叠加中拍摄触摸事件,拍摄图像,然后在手指触摸的位置裁剪出一部分图像。

现在我所有的代码都运行正常,覆盖,事件,裁剪等......但是我似乎无法获得触摸事件的坐标系来匹配UIImage的坐标系。我已经阅读了所有可以获得的文档,我似乎无法弄明白。

我的主要问题是,在使用CGImageCreateWithImageInRect时,我是否需要考虑UIImageOrientation,或者石英算出来了吗?我问的原因是我有一个非常简单的例程,裁剪图像很好,但裁剪后的图像似乎永远不会被我的手指按压?

大部分例行程序是:

-(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);
}

所以,问题是我的裁剪区域(在我的相册中看到)从不匹配我按下的实际区域(它总是照片的其他随机部分),这让我觉得我的坐标系统已关闭。

任何指针都会非常感激,即使只是指向我尚未找到的某些文档的指针。

干杯 亚当

1 个答案:

答案 0 :(得分:0)

您必须始终记住CoreGraphics和UIKit之间的默认坐标系不同。虽然UIKit的起源位于窗口的左上角,但CoreGraphics将此点设置在左下角。我认为这可能足以让您走上正确的轨道,但只是为了重新迭代:

您可以使用此代码反转或翻转您的坐标系。

CGContextTranslateCTM(graphicsContext, 0.0, drawingRect.size.height);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);

同时在Drawing and Printing Guide for iOS

中查看翻转默认坐标系