• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Bild aus Pixel Data zeichnen

jack.jack

Klarapfel
Registriert
20.03.09
Beiträge
280
Wie kann ich bei einem NSBitmapImageRep einzelne Pixel zeichnen? setColor:atX:atY funktioniert, ist jedoch viel zu langsam. Ich habe versucht, über -(unsigned char*)bitmapData versucht darauf zuzugreifen, jedoch weiss ich nicht, wie dieser Array aufgebaut ist / funktioniert.
 
Hallo JackJack,

ich modifiziere Bitmaps ebenfalls mittels BitmapImageRep und setColor. Funktioniert bis dahin ganz ok - aber wollte doch nachfragen ob Du evtl. eine bessere / performantere Lösung gefunden hast?

ciao
Felix
 
Wenn Du komplette Bitmaps manipulierst, dann schau Dir mal Core Image an.
 
@iFisch
Ist zwar nicht schöner, aber performanter, da nicht jedes Mal die Methode setColor aufgerufen wird.
Ich habe zuerst einen Array aus drei Pointers (für rot, grün und blau) vom Typ unsigned char erstsellt und Memory allociert

unsigned char *planes[3];
_planes[0] = (unsigned char *)malloc(width * height * sizeof(unsigned char));
_planes[1] = (unsigned char *)malloc(width * height * sizeof(unsigned char));
_planes[2] = (unsigned char *)malloc(width * height * sizeof(unsigned char));

Nun wird der NSBitmapImageRep mit diesen Daten erstellt:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]initWithBitmapDataPlanes:_planes pixelsWide:width pixelsHigh:height bitsPerSample:sizeof(unsigned char)*8 samplesPerPixel:3
hasAlpha:NO isPlanar:YES colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:width * sizeof(unsigned char) bitsPerPixel:sizeof(unsigned char)*8];

Nun kann mit den drei Pointers redChannel, greenChannel und blueChannel die einzelnen Daten verändern.

unsigned char *redChannel = _planes[0];
unsigned char *greenChannel = _planes[1];
unsigned char *blueChannel = _planes[2];
//width: gesamte breite, y:y-Position des Pixels, x:x-Position des Pixels
int pixel = width*y+x
redChannel[pixel] = (unsigned char)25
blueChannel[pixel] = (unsigned char)25
greenChannel[pixel] = (unsigned char)25;

Nun kann man daraus ein NSImage erstellen mit -addRepresentation