Recupero cgimage da nsview
Domanda
Sto cercando di creare cgimage da Nstextfield.
Ho avuto un po 'di successo in questo. Non riesco ancora a ottenere cgimage che consiste nel solo testo. Voglio dire dire che, ogni volta che catturare il campo di testo ricevo il colore della finestra di sfondo insieme a esso. (Sembra che non riceva informazioni sul canale Alpha)
Ho provato a seguire lo snippet da http://www.cocoadev.com/index.pl?convertnsimagetocgimage
NSBitmapImageRep * bm = [NSBitmapImageRep alloc];
[theView lockFocus];
[bitmap initWithFocusedViewRect:[theView bounds]];
[theView unlockFocus]
[bma retain];// data provider will release this
int rowBytes, width, height;
rowBytes = [bm bytesPerRow];
width = [bm pixelsWide];
height = [bm pixelsHigh];
CGDataProviderRef provider = CGDataProviderCreateWithData( bm, [bm bitmapData], rowBytes * height, BitmapReleaseCallback );
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB );
CGBitmapInfo bitsInfo = kCGImageAlphaPremultipliedLast;
CGImageRef img = CGImageCreate( width, height, 8, 32, rowBytes, colorspace, bitsInfo, provider, NULL, NO, kCGRenderingIntentDefault );
CGDataProviderRelease( provider );
CGColorSpaceRelease( colorspace );
return img;
Qualche aiuto per ottenere cgimage senza colore di sfondo?
Soluzione
-initWithFocusedViewRect:
Legge dal negozio di supporto della finestra, quindi essenzialmente è uno screenshot di quella parte della finestra. Ecco perché stai ottenendo il colore dello sfondo della finestra nella tua immagine.
-[NSView cacheDisplayInRect:toBitmapImageRep:]
è molto simile, ma provoca la visione e le sue sotto -viste, ma non le sue superiews, a ridisegnare se stessi. Se il tuo campo di testo è senza confini, questo potrebbe essere sufficiente per te. (Assicurati di usare -bitmapImageRepForCachingDisplayInRect:
Per creare il tuo nsbitmapimagerep!)
C'è un'altra opzione che potrebbe essere considerata ancora più corretta di quanto sopra. Nstextfield disegna i suoi contenuti utilizzando il suo nstextfieldcell. Non c'è niente che ti impedisca di creare solo un'immagine con le dimensioni appropriate, bloccarla su di essa e poi chiamare -drawInteriorWithFrame:inView:
. Ciò dovrebbe semplicemente disegnare il testo, esattamente come è stato disegnato nel campo di testo.
Infine, se vuoi solo disegnare il testo, non dimenticare NSStringDrawing
. NSString ha alcuni metodi che disegnano con attributi (drawAtPoint:withAttributes:
) e NsattributedString ha anche metodi di disegno (drawAtPoint:
). Potresti usare uno di quelli invece di chiedere a NstextfieldCell di disegnare per te.