NSBitmap zeichnet nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSBitmap zeichnet nicht

    Hallo!

    Habe folgenden simplen Code (10.9.5):

    - (void)drawRect:(NSRect)r
    {
    [super drawRect:r];
    [[bitmap TIFFRepresentation] writeToFile:@"/bm.tiff" atomically:YES];
    [bitmap drawAtPoint:NSZeroPoint];
    }

    Wenn ich die Pixel des Bitmaps innerhalb des drawRect verändere dann sind die Änderungen im bm.tiff zu sehen -> UND im Window !
    Wenn ich die Pixel des Bitmaps innerhalb einer vorangehenden Methode verändere dann sind die Änderungen im bm.tiff zu sehen -> aber NICHT im Window !!?

    Das gilt auch wenn das Bitmap als Rep in einem NSImage vorliegt (dann nützt auch kein recache).
    Weiß vielleicht jemand wie man die Änderungen an einem Bitmap sichtbar machen kann oder woran es liegt ?

    Nächtliche Grüße

    Thomas
  • Was macmoonshine schreibt stimmt natürlich. Dein Problem ist quasi andersrum: innerhalb von drawRect: ist der Kontext des Fensters richtig gesetzt, sodass [bitmap drawAtPoint: ] auch im Fenster landet. In anderen Methoden nicht, woher soll dort die bitmap wissen, auf welche Leinwand sie sich malen soll? Kurz: Der gesamte Zeichencode gehört in drawRect: - und nichts anderes.
    Multigrad - 360°-Produktfotografie für den Mac
  • Ja, das ist richtig. Das writeToFile steht dort nur um zu sehen wie der Inhalt des Bitmaps aussieht. Schließlich wollte ich wissen ob das Bitmap wirklich nicht zeichnet oder einfach nur leer ist. Ersteres ist leider der Fall. Ich vermute, dass ein Bitmap entgegen älterer Implementierungen inzwischen selber sowas wie einen cache hat. Wenn man dort von aussen die Pixel setzt dann sind das nicht immer die Daten, die gerade zum zeichnen verwendet werden. Sonst fällt mir nicht allzuviel dazu ein. Fragt sich nur wie man diesen cache zwangsupdatet? Denn wenn es die TIFFRepresentation kann muss es wohl irgendwie gehen, hmmm...
  • Danke gritsch! Das setPixel: ist genau was ich gesucht habe. Diese methode löst wohl das recache aus. D.h. auch wenn man nur einen pixel darüber setzt dann wird das ganze bitmap aktualisiert. Das spricht dafür, dass es eben doch eine cache gibt. Hat auch die interessante nebenwirkung, dass sich der pointer auf die bitmapDaten ändert und daher neu geholt werden muss.

    Jetzt scheint mir auch klar zu sein was hier passiert. Ist wie in Java, dort wird ein bitmap ans VRAM übergeben bevor es zeichnet und braucht daher ein update. Apple hat wohl im zuge des einbeziehens von grafikkarten ins OS etwas ähnliches vollbracht.

    Nochmals danke für den tip!