Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[cocoa] Enregistrer une image créé e par openGL

2 réponses
Avatar
Louis Balourdet
J'écris un programme créant des images via openGL.
Dans une instance de NSView appelée mapView, j'écris donc ma routine openGL
dans DrawRect.
Je souhaite enregitrer mon image et j'ai essayé en .pdf puis en .tiff,
mais dans les deux cas j'obtiens une image blanche.

Si maintenant dans DrawRect je remplace les instructions openGL par:

NSRect r = NSMakeRect(10, 10, 200, 200);
[[NSColor greenColor] set];
[NSBezierPath fillRect:r];

mes deux routines d'enregistrement fonctionnent parfaitement et j'ai 2
images representant un carré vert, la pdf pesant 4k et la tiff 1Mo, donc
tout semble normal.

Mais avec openGL plus rien...

pour le pdf j'utilise:
NSData *image = [mapView dataWithPDFInsideRect:[mapView bounds]];

et pour le tiff:
NSData *tiff;
tiff = [[NSBitmapImageRep alloc] initWithFocusedViewRect:[mapView bounds]];

NSData *image =[tiff TIFFRepresentation];

Puis dans les 2 cas:

if ([image writeToFile:[sheet filename] atomically:NO]==NO) { etc...

Je comprends que ça ne fonctionne pas en pdf, mais avec le tiff ça devrait
marcher puisque initWithFocusedViewRect: est censé faire un snapshot du
NSView.

Quelqu'un a-t-il une idée ?

2 réponses

Avatar
lucsky
Louis Balourdet wrote:

Je comprends que ça ne fonctionne pas en pdf, mais avec le tiff ça devrait
marcher puisque initWithFocusedViewRect: est censé faire un snapshot du
NSView.


Oui, mais non. :)

Si je ne m'abuse, OpenGL n'est pas rendu dans le backing store de la
fenêtre mais dans un buffer séparé, donc tout ce qui est rendu OpenGL ne
peut pas être utilisé par un contexte Quartz directement (pour une
sauvegarde ou une impression par exemple).

La solution c'est de récupérer la bitmap OpenGL en passant par
'glReadPixels' et de construire une NSBitmapImageRep manuellement à
partir de ce buffer.

--
Luc Heinrich -

Avatar
Louis Balourdet
La solution c'est de récupérer la bitmap OpenGL en passant par
'glReadPixels' et de construire une NSBitmapImageRep manuellement à
partir de ce buffer.

Merci bien. Je vais essayer ça ASAP.


Louis Balourdet