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? P>
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. P>
4 Réponses :
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. P>
L'approche directe est légèrement em> fastidieuse, mais voici: p>
Obtenez l'image Coregraphics. P>
Obtenez le "fournisseur de données" et d'obtenir les données.
Fixez le format que les données sont dans. p>
CGIMAGEGETBITMAPINFO (); P>
CGIMAGEGETBITSPECTEUR (); P>
CGIMAGEGETBITSPERPIXEL (); P>
CGIMAGEGETBYTESPERROW (); P> LI>
Souvencez l'espace de couleur (PNG supporte Greyscale / RGB / Paleté). P>
CGIMAGEGETColorsPace () P> LI>
ol>
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.
cgimageref cgimage = image.cgimage; code> p> li>
Nsdata * D = [(ID) CGDATAPROViderCopyData (CGIMAGEGETDATAPROVider (CGIMAGE)) AutoRelease]; Code> P> LI>
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}} code>).
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. P>
Cette catégorie sur UiImage pourrait être utile #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
Une classe pour le faire pour vous et expliqué aussi: http://www.markj.net/iphone-uiimage-pixel-color/ a> p>