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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top