2013-08-05 21 views
6

Sto cercando di creare un contesto in scala di grigi a 8 bit come segue:CGBitmapContextCreate: parametro combinazione non supportata

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
CGContextRef context = CGBitmapContextCreate(
    data, m_width, m_height, 8, m_width, colorSpace, 
    kCGBitmapByteOrder32Little|kCGImageAlphaNone); 

Ma ho il seguente errore:

CGBitmapContextCreate: unsupported parameter combination: 
8 integer bits/component; 8 bits/pixel; 1-component color space; 
kCGImageAlphaNone; 1936 bytes/row. 

Perché questa combinazione non supportata?

risposta

7

I bit supportate per componente, bit per pixel, combinazioni di spazio colore possono essere trovati in "Quartz 2D Programming Guide"

Come Nikolai ha scritto, utilizzando kCGBitmapByteOrder32Little con kCGImageAlphaNone non ha senso per lo spazio colore grigio (e non supportato) .

Ora a seconda dei byte per riga e altezza, è necessario fornire memoria allocata sufficiente a CGBitmapContextCreate nel parametro dei dati. Non hai mostrato il codice dove hai impostato l'altezza e hai allocato la memoria per i dati, ma immagino che il tuo problema sia lì.

Inoltre, non è necessario allocare la memoria da soli (a partire da iOS 4.0), in base alla documentazione CGBitmapContextCreate, è possibile passare NULL come dati per avere la memoria allocata per l'utente. È ancora possibile accedere al puntatore dati in seguito, richiedendolo con CGBitmapContextGetData.

Un'altra nota è che il passaggio di come bytesPerRow è corretto solo in questo caso (spazio colore grigio con 1 byte per pixel) ma probabilmente non è una buona pratica. Se passi NULL per i dati, puoi anche passare 0 qui per farlo calcolare automaticamente.

+1

+1 per il suggerimento fantastico - "Se passi NULL per i dati, puoi anche passare 0 qui per farlo calcolare automaticamente per te." Funziona ma non sono riuscito a trovare un riferimento nei documenti, ne hai uno? – Robert

+0

È proprio lì nella documentazione della funzione CGBitmapContextCreate, guarda la descrizione del parametro bytesPerRow. – danielv

+0

Sì, non so come mi sia mancato! – Robert

2

È probabilmente lo kCGBitmapByteOrder32Little (che non ha senso per le immagini in scala di grigi a canale singolo in nessun modo).

Si può semplicemente eliminare quello dalle specifiche del formato pixel.

+0

Grazie per la risposta. Ho fatto come hai descritto, ma l'errore ora è stato modificato in: 'CGBitmapContextCreate: byte/riga di dati non validi: dovrebbe essere almeno 7744 per 8 bit interi/componente, 3 componenti, kCGImageAlphaNoneSkipLast. –

Problemi correlati