Zu Ihrer Information, ich habe Keremks Antwort mit meiner ursprünglichen Gliederung kombiniert, die Tippfehler bereinigt, sie verallgemeinert, um eine Reihe von Farben zurückzugeben, und das Ganze zum Kompilieren gebracht. Hier ist das Ergebnis:
+ (NSArray*)getRGBAsFromImage:(UIImage*)image atX:(int)x andY:(int)y count:(int)count
{
NSMutableArray *result = [NSMutableArray arrayWithCapacity:count];
// First get the image into your data buffer
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);
// Now your rawData contains the image data in the RGBA8888 pixel format.
NSUInteger byteIndex = (bytesPerRow * y) + x * bytesPerPixel;
for (int i = 0 ; i < count ; ++i)
{
CGFloat alpha = ((CGFloat) rawData[byteIndex + 3] ) / 255.0f;
CGFloat red = ((CGFloat) rawData[byteIndex] ) / alpha;
CGFloat green = ((CGFloat) rawData[byteIndex + 1] ) / alpha;
CGFloat blue = ((CGFloat) rawData[byteIndex + 2] ) / alpha;
byteIndex += bytesPerPixel;
UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
[result addObject:acolor];
}
free(rawData);
return result;
}
getRGBAsFromImage:image atX:0 andY:0 count:image.size.width*image.size.height
So erhalten Sie RGBAs für die letzte Zeile eines Bildes:getRGBAsFromImage:image atX:0 andY:image.size.height-1 count:image.size.width
Eine Möglichkeit besteht darin, das Bild in einen Bitmap-Kontext zu zeichnen, der von einem bestimmten Puffer für einen bestimmten Farbraum (in diesem Fall RGB) unterstützt wird: (Beachten Sie, dass dadurch die Bilddaten in diesen Puffer kopiert werden möchten es zwischenspeichern, anstatt diesen Vorgang jedes Mal auszuführen, wenn Sie Pixelwerte abrufen müssen)
Siehe unten als Beispiel:
quelle
CGContextDrawImage
erfordert drei Argumente und oben werden nur zwei angegeben ... Ich denke, es sollte seinCGContextDrawImage(context, CGRectMake(0, 0, width, height), image)
Apples technische Fragen und Antworten QA1509 zeigt den folgenden einfachen Ansatz:
Verwenden Sie
CFDataGetBytePtr
diese Option , um zu den tatsächlichen Bytes zu gelangen (und verschiedeneCGImageGet*
Methoden, um zu verstehen, wie sie interpretiert werden).quelle
Ich konnte nicht glauben, dass es hier keine einzige richtige Antwort gibt. Es müssen keine Zeiger zugewiesen werden, und die nicht multiplizierten Werte müssen noch normalisiert werden. Um auf den Punkt zu kommen, hier ist die richtige Version für Swift 4.
UIImage
Nur zur Verwendung.cgImage
.Der Grund, warum Sie das Bild zuerst in einen Puffer zeichnen / konvertieren müssen, ist, dass Bilder verschiedene Formate haben können. Dieser Schritt ist erforderlich, um es in ein konsistentes Format zu konvertieren, das Sie lesen können.
quelle
let imageObj = UIImage(named:"greencolorImg.png"); imageObj.cgImage?.colors(at: [pt1, pt2])
pt1
undpt2
sindCGPoint
Variablen.Hier ist ein SO- Thread, in dem @Matt nur das gewünschte Pixel in einen 1x1-Kontext rendert, indem das Bild so verschoben wird, dass das gewünschte Pixel mit dem einen Pixel im Kontext übereinstimmt.
quelle
quelle
UIImage ist ein Wrapper. Die Bytes sind CGImage oder CIImage
Laut der Apple-Referenz zu UIImage ist das Objekt unveränderlich und Sie haben keinen Zugriff auf die Hintergrundbytes. Während es wahr ist, dass Sie auf die CGImage-Daten zugreifen können, wenn Sie die
UIImage
mit aCGImage
(explizit oder implizit) gefüllt haben , wird sie zurückgegeben,NULL
wenn dieUIImage
von a unterstützt wirdCIImage
und umgekehrt.Allgemeine Tricks, um dieses Problem zu umgehen
Wie angegeben sind Ihre Optionen
Keiner dieser Tricks ist besonders gut, wenn Sie eine Ausgabe wünschen, die keine ARGB-, PNG- oder JPEG-Daten enthält und die Daten nicht bereits von CIImage unterstützt werden.
Meine Empfehlung, versuchen Sie es mit CIImage
Während der Entwicklung Ihres Projekts ist es möglicherweise sinnvoller, UIImage vollständig zu vermeiden und etwas anderes auszuwählen. UIImage wird als Obj-C-Image-Wrapper häufig von CGImage bis zu dem Punkt unterstützt, an dem wir dies für selbstverständlich halten. CIImage ist in der Regel ein besseres Wrapper-Format, da Sie einen CIContext verwenden können , um das gewünschte Format zu erhalten, ohne wissen zu müssen, wie es erstellt wurde. In Ihrem Fall wäre das Abrufen der Bitmap eine Frage des Aufrufs
- render: toBitmap: rowBytes: bounds: format: colorSpace:
Als zusätzlichen Bonus können Sie schöne Manipulationen am Bild vornehmen, indem Sie Filter auf das Bild verketten. Dies löst viele Probleme, bei denen das Bild auf dem Kopf steht oder gedreht / skaliert werden muss usw.
quelle
Aufbauend auf der Antwort von Olie und Algal finden Sie hier eine aktualisierte Antwort für Swift 3
schnell
quelle
Swift 5 Version
Die hier gegebenen Antworten sind entweder veraltet oder falsch, da sie Folgendes nicht berücksichtigen:
image.size.width
/ zurückgegeben wirdimage.size.height
.UIView.drawHierarchy(in:afterScreenUpdates:)
Verfahren BGRA-Bilder erzeugen.CGImage
kann die Größe einer Pixelzeile in Bytes größer sein als die bloße Multiplikation der Pixelbreite mit 4.Der folgende Code soll eine universelle Swift 5-Lösung bereitstellen, um das
UIColor
Pixel für all diese Sonderfälle zu ermitteln. Der Code ist auf Benutzerfreundlichkeit und Klarheit optimiert, nicht auf Leistung.quelle
componentLayout
fehlt Ihnen der Fall, wenn es nur Alpha gibt.alphaOnly
.UIImage
ist das, was Sie tun würden, bevor Sie mit dem Lesen der Pixelfarben beginnen.Basierend auf verschiedenen Antworten, aber hauptsächlich darauf , funktioniert dies für das, was ich brauche:
Als Ergebnis dieser Zeilen haben Sie ein Pixel im AARRGGBB-Format, wobei Alpha in der 4-Byte-Ganzzahl ohne Vorzeichen immer auf FF gesetzt ist
pixel1
.quelle
Verwenden Sie das zugrunde liegende CGImage und seinen dataProvider, um auf die RGB-Rohwerte eines UIImage in Swift 5 zuzugreifen:
https://www.ralfebert.de/ios/examples/image-processing/uiimage-raw-pixels/
quelle