2010-02-10 5 views
10

ich den folgenden Code verwende (aus einem Blog-Post) ein BildBild der Größe verändert Fehler: CGBitmapContextCreate: nicht unterstützte Parameter

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

aber aus irgendeinem Grund, um die Größe abhängig von der Größe Ich versuche mich, um die Größe zu ich der folgende Fehler wird generiert

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

wobei XXX je nach dem Bild unterscheidet.

Das Rechteck, das ich erschaffe, ist proportional zum Bild, ich nehme ein Verhältnis von der Breite/Höhe (abhängig vom Aspekt) und dem Vielfachen, das die Zielbreite/-höhe sein soll.

Hier sind einige Beispiele (X Fehler,/tut), wird die Größe ändern Größe 50xx oder Xx50 sein, je nach Aspekt: ​​

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

Antwort

12

Wo Sie thumbRect schrieb, hast du resizedRect bedeuten? thumbRect kommt sonst nicht vor.

Ich vermute, das Problem ist, dass resizedRect.size.width nicht integral ist. Beachten Sie, dass es sich um einen Gleitpunkt handelt.

Die Parameter width und bytesPerRow von CGBitmapContextCreate werden als Ganzzahlen deklariert. Wenn Sie einen Gleitkommawert wie hier übergeben, wird er abgeschnitten.

Angenommen, Ihre resizedRect.size.width ist 1,25. Dann werden Sie 1 für die Breite übergeben und Boden (1,25 * 4) = 5 als die Bytes pro Zeile. Das ist inkonsequent. Sie möchten immer vier Mal übergeben, was auch immer Sie für die Breite für die Bytes pro Zeile übergeben haben.

Sie können bytesPerRow übrigens auch nur 0 lassen. Dann wählt das System den besten bytesPerRow aus (der oft größer ist als das 4-fache der Breite - er puffert für die Ausrichtung aus).

+0

ja (Kopieren und Einfügen Fehler Formatierung es als Frage) ja ich stimme resizedRect.size.width wird wahrscheinlich ein Gleitkomma sein. Könntest du ein wenig mehr erklären, muss ich nur auf Ganzzahl runden? –

+0

Bitte aktualisieren Sie einfach Ihre Antwort, ich habe nur die 3 Verwendungen der Werte zu int umgewandelt und es sortiert das Problem. (int) resizedRect.size.width usw. –

+0

Ich habe meine Antwort mit mehr Details bearbeitet. – Ken

Verwandte Themen