2010-02-10 6 views
10

estoy usando el siguiente código (de un blog) para cambiar el tamaño de una imagenimagen redimensionada de error: CGBitmapContextCreate: parámetro no soportado

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 
              ); 

pero por alguna razón, dependiendo del tamaño me trato de cambiar el tamaño de recibo el siguiente error generado

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component colorspace; kCGImageAlphaNoneSkipFirst; XXX bytes/row.

donde XXX difiere según la imagen.

El rect que estoy creando es propotional para la imagen, tomo una relación entre el ancho/alto (según el aspecto) y el ancho/alto objetivo.

He aquí algunos ejemplos (errores, doesnt/X), el tamaño de cambio de tamaño será 50xx o xx50 dependiendo de aspecto:

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

Respuesta

12

Cuando usted escribió thumbRect, quiso decir resizedRect? thumbRect no ocurre de otra manera.

Sospecho que el problema es que resizedRect.size.width no es integral. Tenga en cuenta que es un punto flotante.

Los parámetros width y bytesPerRow de CGBitmapContextCreate se declaran como enteros. Cuando pasa un valor de coma flotante, como aquí, se trunca.

Supongamos que resizeRect.size.width es 1.25. Luego terminará pasando 1 por el ancho y piso (1.25 * 4) == 5 como los bytes por fila. Eso es inconsistente Siempre quiere pasar cuatro veces lo que pasó para el ancho de los bytes por fila.

También puede dejar bytesPerRow como 0, por cierto. Luego, el sistema selecciona el mejor byPerRow de bytes (que a menudo es más de 4 veces el ancho, rellena la alineación).

+0

sí (copie y pegue el error formateándolo como una pregunta) sí Acepto que resizedRect.size.width probablemente sea un punto flotante. ¿Podrías explicar un poco más, solo necesito redondear al número entero? –

+0

por favor, acaba de actualizar su respuesta, acabo de lanzar los 3 usos de los valores a int y solucionó el problema. (int) resizedRect.size.width etc –

+0

He editado mi respuesta con más detalle. – Ken

Cuestiones relacionadas