NSBitmapImageRep initWithFocusedViewRect: ... est déprécié. Par quoi le remplacer?
Bonjour
Mon générateur de Mandelbrot emploie la méthode :
NSBitmapImageRep *bitmapB = [[NSBitmapImageRep alloc]initWithFocusedViewRect:cadre]; //oui, du bon vieux Objectiv-C
Cette méthode ne fonctionne plus sous MacOSX 11
J'ai essayé :
NSBitmapImageRep *bitmapBip = [[NSBitmapImageRep alloc]initWithBitmapDataPlanes:NULL
pixelsWide:self.bounds.size.width
pixelsHigh:self.bounds.size.width
bitsPerSample:8
samplesPerPixel:4
hasAlpha:NO
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSBitmapFormatFloatingPointSamples
bytesPerRow: 4 * self.bounds.size.width
bitsPerPixel:32];
ou encore :
NSImage *imageB = [[[NSImage alloc]initWithSize:NSMakeSize(self.bounds.size.width, self.bounds.size.height)]retain];
[imageB lockFocus];
NSBitmapImageRep *bitmapB = [[[NSBitmapImageRep alloc]initWithData:imageB.TIFFRepresentation]retain];
qui ne fonctionnent pas mieux.
Auriez-vous une idée?
Merci par avance...
Réponses
As-tu essayé cacheDisplayInRect:toBitmapImageRep: ?
(C'est dans NSView)
Exact, ce qu'indique Apple codeworkshop.net/objc-diff/sdkdiffs/macos/10.14/AppKit.html
Tu fais le rendu à l'écran ? C'est très lent.
Merci pour vos posts. J'ai du mal à initialiser le NSBitmapImageRep, quelle que soit la formule. Il faut l'initialiser avant d'employer cacheDisplayInRect:toBitmapImageRep:
En console monBitmap.description donne (null) dans tous les cas, et d'ailleurs rien ne s'affiche.
Après Céroce, c'est peut-être plus lent, mais il m'a semblé que programmer un filtre CIImage n'était pas la solution pour programmer une Mandelbrot.
Effectivement, utiliser Core Image serait difficile, mais ce n'est pas ce que je propose.
Tu peux écrire directement dans la bitmap. Demande si tu ne vois pas ce que je veux dire.
C'est bien ce que je pensais faire : l'image affichée est crée à partir du BitmapImage après les calculs.
Une méthode calcule la couleur des points (un tableau d'une classe spéciale ne comportant que les flottants x/y/r/g/b), le bimap crée une image "virtuelle" à partir de ces flottants et est transformé en une image NSImage qui, elle est affichée.
Le problème est que je n'arrive pas à initialiser le NSBitmapImageRep. Il m'en faut un initialisé à la bonne taille, c'est tout. Comment fait-on cela aujourd'hui? (au besoin je mets un jpeg qui ne sert à rien dans le logiciel, le NSBitmapImageRep est créé à partir de ce "data" et on modifie la taille et les couleurs ensuite??? Pas très élégant!)
Ceci
NSBitmapImageRep *bitmapB = [self bitmapImageRepForCachingDisplayInRect:[self visibleRect]];
fait carrément planter l'appli.
J'ai fait un essai:
Mais ça fonctionne mal.
Le problème est que les pixels ne sont pas organisés dans l'ordre RGBA.
En fait, il y a souvent des ennuis avec NSBitmapImageRep et NSImage. Personnellement, je travaille toujours avec CGBitmapContext. Jamais de surprises avec Core Graphics.
J'essaie cela ce WE. Merci Céroce!
Tu peux trouver dans quel ordre sont les pixels, mais ça risque de ne marcher que chez toi. À voir si c'est un problème… si tu diffuses l'appli ou pas.
Sinon, utilise un CGBitmapContext. Tu pourras le transformer facilement en CGImage, et initialiser une NSImage avec la CGImage. L'avantage du CGBitmapContext est que tu peux définir le format des pixels de façon précise. (par exemple dans l'ordre RGBX).
Il y a moyen de faire ça directement avec Metal, histoire de préparer l'avenir ?
J'envisage deux problèmes à travailler avec le GPU:
C'est certainement faisable, mais il faut adapter l'algorithme.
L'algorithme naïf n'est déjà pas assez performant, et sur Wikipédia, ils en proposent un autre que je n'ai jamais essayé.
Il y a exemple sur GitHub de Mandelbrot et metal
ici: https://github.com/haawa799/Metal-Mandelbrot-Fractal
Bonjour
Merci pour tous vos posts.
En fait, en faisant une nouvelle application (avec le ramasse miette etc.) et l'ancien code avec cette seule modification :
NSBitmapImageRep *bitmapBip = [self bitmapImageRepForCachingDisplayInRect:[self visibleRect]];
cela s'est remis à marcher très bien. L'ancien code était-il trop compilé??? L'ancienne devait avoir ... (elle datait de MaxOS 10.10)
Comme quoi! Merci en tous les cas pour votre site et vos réponses. Et Joyeux Noël bien sûr!