11
votes

Un moyen simple de lire des valeurs de couleur pixel à partir d'une image PNG sur l'iPhone?

Y a-t-il un moyen facile d'obtenir un tableau en deux dimensions ou quelque chose de similaire qui représente les données de pixels d'une image?

J'ai des images png noires et blanches et je veux simplement lire la valeur de couleur à une certaine coordonnée. Par exemple, la valeur de couleur à 20/100.


0 commentaires

4 Réponses :


4
votes

Vous pouvez mettre le PNG dans une vue d'image, puis utiliser Cette méthode pour obtenir la valeur de pixel à partir d'un contexte graphique qui vous dessineriez l'image dans.


0 commentaires

1
votes

L'approche directe est légèrement fastidieuse, mais voici:

  1. Obtenez l'image Coregraphics.

    cgimageref cgimage = image.cgimage;

  2. Obtenez le "fournisseur de données" et d'obtenir les données. Nsdata * D = [(ID) CGDATAPROViderCopyData (CGIMAGEGETDATAPROVider (CGIMAGE)) AutoRelease];

  3. Fixez le format que les données sont dans.

    CGIMAGEGETBITMAPINFO ();

    CGIMAGEGETBITSPECTEUR ();

    CGIMAGEGETBITSPERPIXEL ();

    CGIMAGEGETBYTESPERROW ();

  4. Souvencez l'espace de couleur (PNG supporte Greyscale / RGB / Paleté).

    CGIMAGEGETColorsPace ()

    L'approche indirecte consiste à dessiner l'image dans un contexte (note que vous devrez peut-être spécifier l'ordre d'octet du contexte si vous souhaitez des garanties) et de lire les octets.
    Si vous ne voulez que des pixels simples, il peut être plus rapide de dessiner l'image dans un contexte 1x1 avec la droite recto
    (quelque chose comme (cgrect) {{- x, -y}, {imgwidth, imgheight}} ).
    Cela gérera la conversion de l'espace de couleur pour vous. Si vous voulez juste une valeur de luminosité, utilisez un contexte de greyscale.


0 commentaires

26
votes

Cette catégorie sur UiImage pourrait être utile Source SUB>

#import <CoreGraphics/CoreGraphics.h>

#import "UIImage+ColorAtPixel.h"

@implementation UIImage (ColorAtPixel)

- (UIColor *)colorAtPixel:(CGPoint)point {
    // Cancel if point is outside image coordinates
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) {
        return nil;
    }


    // Create a 1x1 pixel byte array and bitmap context to draw the pixel into.
    // Reference: http://stackoverflow.com/questions/1042830/retrieving-a-pixel-alpha-value-for-a-uiimage
    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y);
    CGImageRef cgImage = self.CGImage;
    NSUInteger width = CGImageGetWidth(cgImage);
    NSUInteger height = CGImageGetHeight(cgImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData, 
                                                 1,
                                                 1,
                                                 bitsPerComponent, 
                                                 bytesPerRow, 
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextSetBlendMode(context, kCGBlendModeCopy);

    // Draw the pixel we are interested in onto the bitmap context
    CGContextTranslateCTM(context, -pointX, -pointY);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
    CGContextRelease(context);

    // Convert color values [0..255] to floats [0.0..1.0]
    CGFloat red   = (CGFloat)pixelData[0] / 255.0f;
    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
    CGFloat blue  = (CGFloat)pixelData[2] / 255.0f;
    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

@end


0 commentaires

2
votes

Une classe pour le faire pour vous et expliqué aussi: http://www.markj.net/iphone-uiimage-pixel-color/


0 commentaires