• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

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