• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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.
 

iFisch

Braeburn
Registriert
30.06.12
Beiträge
46
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
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Wenn Du komplette Bitmaps manipulierst, dann schau Dir mal Core Image an.
 

jack.jack

Klarapfel
Registriert
20.03.09
Beiträge
280
@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