Как использовать CGImageCreateWithImageInRect для iPhone 4 (HD)? - PullRequest
19 голосов
/ 30 июня 2010

Я использую следующий код для получения изображений со спрайта.И он отлично работает везде, кроме iPhone 4 (версия HD).

- (UIImage *)croppedImage:(CGRect)rect {
    CGImageRef image = CGImageCreateWithImageInRect([self CGImage], rect);
    UIImage *result = [UIImage imageWithCGImage:image];
    CGImageRelease(image);
    return result;
}

iPhone 4 автоматически загружает версию изображения HD (sprite@2x.png) вместо sprite.png.Исходное изображение имеет масштаб 2, но полученное изображение имеет масштаб 1 и неправильный размер.

Как справиться с этим поведением, принимая во внимание различные масштабы для iPhone 3G [s] и iPhone 4?

Я прочитал этот документ , но об использовании CGImageCreateWithImageInRect здесь ничего не сказано.

Ответы [ 2 ]

32 голосов
/ 03 июля 2010

Из того, что я могу сказать, CGImageCreateWithImageInRect будет делать правильные вещи.Что вам нужно изменить, так это UIImage initilization

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/occ/clm/UIImage/imageWithCGImage:scale:orientation:

Измените его на [UIImage imageWithCGImage:image scale:self.scale orientation:self. imageOrientation], и все должно работать нормально(предполагается, что это категория на UIImage, которая выглядит так, как она есть)

14 голосов
/ 28 июля 2013

Вы должны умножить прямоугольник обрезки на масштаб изображения. Исходя из моего опыта, нет необходимости использовать любую другую инициализацию изображения.

- (UIImage *)_cropImage:(UIImage *)image withRect:(CGRect)cropRect
{
    cropRect = CGRectMake(cropRect.origin.x * image.scale,
                          cropRect.origin.y * image.scale,
                          cropRect.size.width * image.scale,
                          cropRect.size.height * image.scale);

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    return croppedImage;
}
...