Ошибка изменения размера изображения: 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 раза больше ширины - он выравнивается для выравнивания).