Ошибка изменения размера изображения: CGBitmapContextCreate: неподдерживаемый параметр

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

if (inImage.size.width <= inImage.size.height) {
    // Portrait
    ratio = inImage.size.height / inImage.size.width;
    resizedRect = CGRectMake(0, 0, width, width * ratio);
}
else {
    // Landscape
    ratio = inImage.size.width / inImage.size.height;
    resizedRect = CGRectMake(0, 0, height * ratio, height);
}

CGImageRef          imageRef = [inImage CGImage];
CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

if (alphaInfo == kCGImageAlphaNone)
    alphaInfo = kCGImageAlphaNoneSkipLast;

CGContextRef bitmap = CGBitmapContextCreate(
                                            NULL,
                                            resizedRect.size.width,     // width
                                            resizedRect.size.height,        // height
                                            CGImageGetBitsPerComponent(imageRef),   // really needs to always be 8
                                            4 * resizedRect.size.width, // rowbytes
                                            CGImageGetColorSpace(imageRef),
                                            alphaInfo
                                            );

но по какой-либо причине в зависимости от размера, я пытаюсь изменить размер, чтобы получить следующую генерируемую ошибку

CGBitmapContextCreate: неподдерживаемый комбинация параметров: 8 целых бит/компонент; 32 бит/пиксель; 3-компонентное цветовое пространство; kCGImageAlphaNoneSkipFirst; XXX байт/строки.

где XXX отличается в зависимости от того, какое изображение.

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

Вот несколько примеров (X errors,/doesnt), размер размера будет 50xX или Xx50 в зависимости от аспекта:

Source   50x50   69x69
430x320  /      X
240x320  /      /
272x320  /      /
480x419  /      X
426x320  X      X
480x256  X      X

Ответ 1

Где вы написали thumbRect, вы имели в виду resizedRect? thumbRect иначе не происходит.

Я подозреваю, что проблема заключается в том, что resizedRect.size.width не является интегралом. Обратите внимание, что это плавающая точка.

Параметры width и bytesPerRow CGBitmapContextCreate объявляются как целые числа. Когда вы передаете значение с плавающей запятой, например здесь, оно усекается.

Предположим, что ваш resizedRect.size.width равен 1,25. Затем в итоге вы пройдете 1 для ширины и пола (1.25 * 4) == 5 как байты в строке. Это непоследовательно. Вы всегда хотите передать в четыре раза все, что вы передали для ширины для байтов в строке.

Вы также можете просто оставить bytesPerRow равным 0. Затем система выбирает лучший bytesPerRow (который часто больше, чем в 4 раза больше ширины - он выравнивается для выравнивания).