Antwort
Wenn Sie zwei UIImagages haben, sollten Sie ihre CGImageRef
Quarzrepräsentationen von diesen Objekten erhalten. Erstellen Sie dann zwei neue Bitmap-Kontexte, die von einem Speicherpuffer unterstützt werden, den Sie erstellen und übergeben, jeweils einen für jedes der Bilder. Verwenden Sie dann CGContextDrawImage
, um die Bilder in die Bitmap-Kontexte zu zeichnen. Jetzt befinden sich die Bytes der Bilder in den Puffern. Sie können dann manuell oder memcmp
durchlaufen, um nach Unterschieden zu suchen.
Apples eigene detaillierte Erklärung und Beispielcode um Bitmap-Kontext erstellen und in diese Zeichnung ist hier:
Der Unterschied für Sie ist, dass Sie ein vorhandenes Bild in den Kontext sind zu ziehen. Verwenden Sie hierzu CGContextDrawImage
.
Whoaaaa ... Das ist irgendwie verwirrend ich bin nicht auf der Suche nach einer freien Fahrt (ich möchte eigentlich von diesem lernen), aber könnten Sie etwas Code schreiben. Ich bin nicht wirklich frustral mit CG-Methoden .. Oder zumindest versuchen, es zu erklären für einen Noob. – user377419
Ich habe einen Link zu guten Informationen hinzugefügt. Wenn es immer noch etwas über deinem Kopf ist, schau dir die Tutorials und Apples Dokumentation zu den Grundlagen von Core Graphics an. Es ist ein zu großes Thema, das als Frage hier auf SO beantwortet werden kann, und Sie müssen das verstehen, wenn Sie eine substantielle Bildarbeit an iOS machen. –
Erhm Das war verwirrend ... Jemand sagte, du könntest es einfach in ein Binärbild oder einfach in Graustufen umwandeln und das vergleichen. Könnte ich das tun? – user377419
hier ‚s Codebeispiel
-(NSMutableArray*)getImageBinary:(UIImage*)ImageToCompare
{
int i = 0;
int step = 4;
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
//void * bitmapData;
//int bitmapByteCount;
int bitmapBytesPerRow;
// Get image width, height. We'll use the entire image.
size_t pixelsWide = CGImageGetWidth(ImageToCompare.CGImage);
size_t pixelsHigh = CGImageGetHeight(ImageToCompare.CGImage);
// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow = (pixelsWide * 4);
NSMutableArray *firstImagearray=[[NSMutableArray alloc]init];
//bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
// Use the generic RGB color space.
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating color space\n");
return nil;
}
// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
//bitmapData = malloc(bitmapByteCount);
// if (bitmapData == NULL)
// {
// fprintf (stderr, "Memory not allocated!");
// CGColorSpaceRelease(colorSpace);
// return NULL;
// }
// Create the bitmap context. We want pre-multiplied ARGB, 8-bits
// per component. Regardless of what the source image format is
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.
context = CGBitmapContextCreate (NULL,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
//free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGRect rect = {{0,0},{pixelsWide, pixelsHigh}};
//
// Draw the image to the bitmap context. Once we draw, the memory
// allocated for the context for rendering will then contain the
// raw image data in the specified color space.
CGContextDrawImage(context, rect, ImageToCompare.CGImage);
// Make sure and release colorspace before returning
CGColorSpaceRelease(colorSpace);
/////**********
size_t _width = CGImageGetWidth(ImageToCompare.CGImage);
size_t _height = CGImageGetHeight(ImageToCompare.CGImage);
unsigned char* data = CGBitmapContextGetData (context);
if (data != NULL)
{
int max = _width * _height * 4;
for (i = 0; i < max; i+=step)
{
[firstImagearray addObject:[NSNumber numberWithInt:data[i + 0]]];
[firstImagearray addObject:[NSNumber numberWithInt:data[i + 1]]];
[firstImagearray addObject:[NSNumber numberWithInt:data[i + 2]]];
[firstImagearray addObject:[NSNumber numberWithInt:data[i + 3]]]; }
}
if (context == NULL)
// error creating context
return nil;
//if (data) { free(data); }
if (context) {
CGContextRelease(context);
}
return firstImagearray;
}
-(BOOL)Compare:(UIImage*)ImageToCompare secondImage:(UIImage*)secondImage
{
ImageToCompare=[ImageToCompare scaleToSize:CGSizeMake(self.appdelegate.ScreenWidth,self.appdelegate.ScreenHeigth)];
secondImage=[secondImage scaleToSize:CGSizeMake(self.appdelegate.ScreenWidth, self.appdelegate.ScreenHeigth)];
NSArray *first=[[NSArray alloc] initWithArray:(NSArray *)[self getImageBinary:ImageToCompare]];
NSArray *second=[[NSArray alloc] initWithArray:(NSArray *)[self getImageBinary:secondImage]];
for (int x=0; x<first.count; x++)
{
if ([((NSNumber*)[first objectAtIndex:x]) intValue] ==[((NSNumber*)[second objectAtIndex:x]) intValue])
{
}
else
{
return NO;
}
}
return YES;
}
Dies ist, was ich in meinen Unit-Tests verwenden, um Bilder zu vergleichen. Im Gegensatz zu anderen Verfahren (z. B. UIImagePNGRepresentation
) funktioniert es sogar, wenn die Bilder einen anderen Farbraum haben (z. B. RGB und Graustufen).
Es ist nicht sehr effizient, so würde ich empfehlen, es im Produktionscode zu verwenden, es sei denn Leistung ist kein Problem.
Vollständige Beschreibung: https://gist.github.com/hpique/dedb719817ac8c50afea – hpique
Wenn Self ein UIImage ist, können Sie UIImagePNGRepresentation direkt darauf aufrufen, ohne es zuerst zu zeichnen. Siehe auch [convert UIImage in NSData und zurück zu UIImage] (http://stackoverflow.com/questions/20013144/convert-uiimage-to-nsdata-and-back-to-uiimage) – lazi74
- 1. Wie vergleichen PHAsset zu UIImage
- 2. Generiere Hash von UIImage
- 3. Hinzufügen UIImage auf einem anderen UIImage
- 4. UIImage userinfo
- 5. Drehen UIImage?
- 6. Wie löschen Teil von UIImage mit einem anderen UIImage
- 7. Was ist der Unterschied zwischen UIImage (benannt :) und UIImage (imageLiteralResourceName :)?
- 8. Swift 2: Update UIImage Dictionary mit UIImage() var von UIImagePicker
- 9. Loading UIImage from UIImagePickerControllerReferenceURL
- 10. NSData und UIImage
- 11. hinzufügen UIImage in CALayer
- 12. UIImage Gif loading delegate?
- 13. Wie gif Asset UIImage
- 14. Drehen UIImage in swift
- 15. UIImage Picker ändert Bildgröße
- 16. So drehen Sie UIImage
- 17. Festlegen eines UIImage-Rahmens
- 18. UIImage from CGImageRef
- 19. Suchen eines UIImage-Dateityps
- 20. vererben UIImage Problem
- 21. Qualität der UIImage
- 22. UIImage animationImages Farbtonfarbe?
- 23. UIImage to PHAsset
- 24. Convert UIImage zu CMSampleBufferRef
- 25. UIImage Rotation benutzerdefinierte Grad
- 26. UIImage and resizableImageWithCapInsets Swift
- 27. Anpassen UIImage in UIImageView
- 28. UIImage in UITableViewCell
- 29. Convert base64string in UIImage
- 30. Zeichnen UIImage in CurrentContext
Quantifizieren "vergleichen". –
Vergleichen Sie die Pixel oder Bitmaps, um festzustellen, ob sie identisch sind. – user377419