Ориентация и происхождение с CoreGraphics и CGImageCreateWithImageInRect - PullRequest
1 голос
/ 07 ноября 2011

Я использую CGImageCreateWithImageInRect, чтобы обрезать снимок, сделанный камерой. Ориентация iPhone (и фотоизображения) - «Портрет», и, насколько я понимаю, CGImageCreateWithImageInRect ожидает, что источник находится в левом нижнем углу телефона, когда он удерживается в «Портрете». Другими словами, начало координат должно начинаться с приращений 0,480 и y, когда вы поднимаетесь к верхнему левому углу, а x остается прежним.

Однако, к моему удивлению, мне пришлось переместить координату x, чтобы следующий код работал правильно. Начало координат х должно было начинаться в верхнем правом углу, при этом у оставалось неизменным. Глядя на другие случаи использования CGImageCreateWithImageInRect в сети и здесь, на SO, я не вижу никакого кода, чтобы смягчить возникшую у меня проблему, поэтому я озадачен, почему следующий код работает только тогда, когда источник перемещен из 0,0 до 320,0.

Может кто-нибудь добавить понимание? Спасибо!

- (UIImage *)crop:(CGRect)rect {
    CGImageRef croppedImageRef = CGImageCreateWithImageInRect([self CGImage], CGRectMake(rect.origin.y, [self size].width - rect.origin.x - rect.size.width, rect.size.height, rect.size.width));
    UIImage *croppedImage = [UIImage imageWithCGImage:croppedImageRef scale:self.scale orientation:[self imageOrientation]]; 
    CGImageRelease(croppedImageRef);
    return croppedImage;

}

1 Ответ

2 голосов
/ 10 ноября 2011

Я думаю, что это отвечает на мой собственный вопрос:

Из Основы AV Guide :

Вы передаете CGPoint, где {0,0} представляетверхний левый угол области изображения, а {1,1} представляет нижний правый угол в альбомном режиме с кнопкой «Домой» справа - это применимо, даже если устройство находится в портретном режиме.

Так что длявсе изображения с камеры, кажется, что источник (x = 0, y = 0) находится в верхнем правом углу портретной ориентации влево, что для Core Graphics переводится в (y, -x).

...