Ошибка изменения размера изображения: CGBitmapContextCreate: неподдерживаемый параметр - PullRequest
10 голосов
/ 10 февраля 2010

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

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 ошибок, / не), размер изменения будет 50xX или Xx50 в зависимости от аспекта:

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

1 Ответ

12 голосов
/ 10 февраля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...