Хороший способ использовать вопросы CGImageCreateWithImageInRect, UIImage и UIImagePickerController - PullRequest
5 голосов
/ 06 октября 2010

Я пытаюсь сделать что-то, что в теории должно быть довольно простым, но я уже несколько дней гоняюсь за своим хвостом.Я пытаюсь взять событие касания из наложения экрана, захватить изображение и обрезать участок изображения вокруг того места, где касался палец.

Теперь весь мой код работает нормально, наложение, события, кадрирование и т. д. Однако я не могу получить систему координат события касания, соответствующую системе координат UIImage.Я прочитал все документы, которые у меня есть, но я никак не могу понять.

Мой главный вопрос: нужно ли учитывать UIImageOrientation при использовании CGImageCreateWithImageInRect, иликварц разобраться?Причина, по которой я спрашиваю, состоит в том, что у меня есть очень простая процедура, которая просто обрезает изображения, но обрезанное изображение никогда не появляется там, где мой палец нажимал ??

Основная часть процедуры:

-(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 голосов
/ 27 марта 2012

Вы всегда должны помнить, что система координат по умолчанию отличается между CoreGraphics и UIKit. В то время как UIKit начинается с его источника в верхнем левом углу окна, CoreGraphics имеет эту точку в левом нижнем углу. Я думаю, что этой информации может быть достаточно, чтобы поставить вас на правильный путь, но просто повторить:

Вы можете использовать этот код, чтобы инвертировать или перевернуть вашу систему координат.

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

Также просмотрите Перемещение систем координат по умолчанию в Руководство по рисованию и печати для iOS

...