Frage

Wie kann ich Sinn der Bilddaten für ein Graustufenbild machen das folgende Szenario gegeben: I-Capture-Videodaten aus dem „Probenpuffer“ und einen 80x20 Abschnitt extrahieren und dann drehen, die in ein Graustufen UIImage. Aber wenn ich die Rohpixelwert untersuchen Bytes Ich bin nicht in der Lage Sinn von ihnen in einer Art und Weise zu machen, die mich auf und „Binarisieren“ gehen lassen würden sie (mein eigentliches Ziel).

Wenn ich einfach speichern die UIImage in das Fotoalbum UIImageWriteToSavedPhotosAlbum mit nur, um zu überprüfen, welche Art von Bilddaten Ich habe, habe ich in der Tat eine ebene, weiß 80x20 Bild (es ist eigentlich hellgraue). Ich erfasst ein einfaches weißes Bild, Dinge zu vereinfachen, sind nur Werte zwischen sehen erwarten, sagen wir, 200 oder so und 255, und doch gibt es Abschnitte der Bilddaten voller Nullen, die eindeutig Reihen von schwarzen Pixeln vor. Jede Hilfe ist willkommen. Der entsprechende Code und die Bilddaten (16 Pixel zu einer Zeit) sind unten.

Hier ist, wie ich das 80x20 Graustufenbild von einem Teil der CMSampleBufferRef Videodaten zu erstellen:

UIImage *imageFromImage(UIImage *image, CGRect rect)
{   
    CGImageRef sourceImageRef = [image CGImage];  
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);  

    CGImageRef grayScaleImg = grayscaleCGImageFromCGImage(newImageRef);
    CGImageRelease(newImageRef);  

    UIImage *newImage = [UIImage imageWithCGImage:grayScaleImg scale:1.0 orientation:UIImageOrientationLeft]; 

    return newImage;  
}  

CGImageRef grayscaleCGImageFromCGImage(CGImageRef inputImage) 
{
    size_t width = CGImageGetWidth(inputImage);
    size_t height = CGImageGetHeight(inputImage);

    // Create a gray scale context and render the input image into that
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                    4*width, colorspace, kCGBitmapByteOrderDefault);

    CGContextDrawImage(context, CGRectMake(0,0, width,height), inputImage);

    // Get an image representation of the grayscale context which the input
    //    was rendered into.
    CGImageRef outputImage = CGBitmapContextCreateImage(context);

    // Cleanup
    CGContextRelease(context);
    CGColorSpaceRelease(colorspace);

    return (CGImageRef)[(id)outputImage autorelease];
}

und dann, wenn ich den folgenden Code verwenden, um die Pixeldaten an die Konsole zu speichern:

    CGImageRef inputImage = [imgIn CGImage];
CGDataProviderRef dataProvider = CGImageGetDataProvider(inputImage);
CFDataRef imageData = CGDataProviderCopyData(dataProvider);
const UInt8 *rawData = CFDataGetBytePtr(imageData);

size_t width = CGImageGetWidth(inputImage);
    size_t height = CGImageGetHeight(inputImage);

    size_t numPixels = height * width;
for (int i = 0; i < numPixels ; i++)
{   
   if ((i % 16) == 0)
          NSLog(@" -%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-\n\n", rawData[i],         
             rawData[i+1], rawData[i+2], rawData[i+3], rawData[i+4], rawData[i+5], 
             rawData[i+6], rawData[i+7], rawData[i+8], rawData[i+9], rawData[i+10], 
             rawData[i+11], rawData[i+12], rawData[i+13], rawData[i+14], rawData[i+15]);
}

ich konsequent Ausgabe wie folgt:

-216-217-214-215-217-215-216-213-214-214-214-215-215-217-216-216 -

-219-219-216-219-220-217-212-214-215-214-217-220-219-217-214-219 -

-216-216-218-217-218-221-217-213-214-212-214-212-212-214-214-213 -

-213-213-212-213-212-214-216-214-212-210-211-210-213-210-213-208 -

-212-208-208-210-206-207-206-207-210-205-206-208-209-210-210-207 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

(Dieses Muster wiederholt sich für die verbleibenden Bytes, 80 Bytes von Pixeldaten in den 200er, abhängig von Beleuchtung, gefolgt von 240 Bytes von Nullen - es gibt eine insgesamt 1600 Bytes, da das Bild 80x20)

War es hilfreich?

Lösung

Dieses:

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                4*width, colorspace, kCGBitmapByteOrderDefault);

Sollte sein:

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                width, colorspace, kCGBitmapByteOrderDefault);

Mit anderen Worten, für ein 8-Bit-Graubild, die Anzahl der Bytes pro Zeile ist die gleiche wie die Breite.

Andere Tipps

Sie haben wahrscheinlich Bild schreiten vergessen - Sie gehen davon aus, dass Ihre Bilder als Breite * Höhe gespeichert sind aber mehrere Systeme speichern sie als Schritt * Höhe, wo schreiten> Breite. Die Nullen sind padding, dass Sie sollten überspringen.

By the way, was meinst du mit "Binarisieren"? Ich denke, man mittlere Quantisierungsraster auf eine weniger Graustufen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top