2016-06-06 1 views
0

Ich habe einige Bitmap-Daten in Form eines Arrays von 32-Bit-Ints (jedes ein rgba) Pixel, auf die von einer C-Variable gezeigt wird. Gibt es eine Möglichkeit, das von den Bitmap-Daten im Xcode-Debugger beschriebene Bild zu sehen?Wie kann ich eine Bitmap (in C) im Xcode Debugger sehen?

Edit: Es gibt eine Antwort hier, die davon abhängig ist, dass die Quelle Objective C ist. Ich frage speziell, wie man das für C-Quellcode tut, da die in dieser Antwort aufgelisteten Typen (nach meinem Wissen) nicht vorhanden sind C.

+4

Ich wäre überrascht, wenn es ist. –

+2

überraschend, hat es diese Fähigkeit-in Ziel C, für bestimmte Datentypen: http://StackOverflow.com/Questions/2780793/xcode-debugging-Anzeigen-Bilder – bblack

+1

Nizza. Ich fühle mich alt .. –

Antwort

0

Um Quick Look im Debugger zu verwenden, müssen Sie ein Bild aus diesem Puffer erstellen und die Breite, Höhe, Bits pro Komponente, Bytes pro Zeile, CGBitmapInfo (dh die Reihenfolge der Komponenten im Puffer) definieren) um es zu sehen. Dann können Sie die Standard-Debugger-Schnellansichtsfunktionen verwenden.

- (UIImage *)imageWithBuffer:(UInt32 *)buffer width:(size_t)width height:(size_t)height { 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast); 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage *image = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return image; 
} 

Objective-C

FYI, nimmt die oben, dass Sie wie so Ihre 32-Bit-Werten gefüllt:

UInt32 value = red | green << 8 | blue << 16 | alpha << 24; 

Wenn Ihr Byte-Reihenfolge um die andere Art und Weise ist ...

UInt32 value = red << 24 | green << 16 | blue << 8 | alpha 

... dann würden Sie kCGBitmapByteOrder32Little für den Bitmap-Info-Parameterhinzufügen:

CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Little); 

Wie Sie sehen, wie die Interpretation der Bitmap-Puffer kann in Abhängigkeit von diesen Parametern abhängig, so ist dies, warum der Debugger mehr Informationen zu wissen, als nur den Puffer, um den Debugger Quick Look braucht um das Bild für Sie rendern zu können.


Hinweis, gab es einige Bedenken, dass dies Objective-C-Code war. Es funktioniert aus einer C-Funktion in einer .m Datei, sondern nur die Funktion Signatur zu ändern, wie unten dargestellt:

UIImage *imageWithBuffer(UInt32 *buffer, size_t width, size_t height) { 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage *image = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return image; 
} 

Nachgeben:

C

Dies ist leider immer noch mit UIImage. Laut der Dokumentation sollte die CGImageRef mit Quick Look arbeiten (die Notwendigkeit für die UIImage), aber meiner Erfahrung nach, hat dies Probleme (von Abstürzen Xcode, um Ihnen einfach die lästige zeigt "Konnte nicht laden Daten für .. ." Botschaft).