Respuesta
Si tiene dos UIImages, debería obtener sus representaciones de cuarzo CGImageRef
de esos objetos. A continuación, cree dos nuevos contextos de mapa de bits respaldados por un búfer de memoria que cree y pase, uno para cada una de las imágenes. Luego use CGContextDrawImage
para dibujar las imágenes en los contextos del mapa de bits. Ahora los bytes de las imágenes están en los buffers. Puede realizar un ciclo manualmente o memcmp
para verificar las diferencias. propio código explicación detallada y la muestra
de Apple alrededor de crear contextos de mapa de bits y el dibujo en ellos está aquí:
La diferencia para usted es que va a dibujar una imagen existente en el contexto. Use CGContextDrawImage
para esto.
Whoaaaa ... Eso es un poco confuso, no estoy buscando un viaje gratis (de hecho, quiero aprender de esto) pero podría publicar algún código. No soy realmente framillar con ningún método de CG. O al menos trate de explicarle que sea mejor para un novato. – user377419
He agregado un enlace a buena información. Si todavía está un poco sobre su cabeza, consulte los tutoriales y los documentos de Apple sobre los conceptos básicos de Core Graphics. Es un tema demasiado grande para responder como una pregunta aquí en SO, y debe comprenderlo si está haciendo una imagen sustancial en iOS. –
Erhm Eso fue confuso ... Alguien dijo que solo podía convertirlo en una imagen binaria o simplemente en escala de grises y comparar eso. ¿Podría hacer eso? – user377419
aquí 's ejemplo de código
-(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;
}
Esto es lo que utilizo en mis pruebas de unidad para comparar imágenes. A diferencia de otros métodos (por ejemplo, UIImagePNGRepresentation
), funciona incluso si las imágenes tienen un espacio de color diferente (por ejemplo, RGB y escala de grises).
@implementation UIImage (HPIsEqualToImage)
- (BOOL)hp_isEqualToImage:(UIImage*)image
{
NSData *data = [image hp_normalizedData];
NSData *originalData = [self hp_normalizedData];
return [originalData isEqualToData:data];
}
- (NSData*)hp_normalizedData
{
const CGSize pixelSize = CGSizeMake(self.size.width * self.scale, self.size.height * self.scale);
UIGraphicsBeginImageContext(pixelSize);
[self drawInRect:CGRectMake(0, 0, pixelSize.width, pixelSize.height)];
UIImage *drawnImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return UIImagePNGRepresentation(drawnImage);
}
@end
No es muy eficiente, por lo que recomendaría no usarlo en el código de producción a menos que el rendimiento no sea un problema.
Completa: https://gist.github.com/hpique/dedb719817ac8c50afea – hpique
si el self es un UIImage, puede llamar directamente a UIImagePNGRepresentation en él, sin dibujarlo primero. Ver también [convertir UIImage a NSData y volver a UIImage] (http://stackoverflow.com/questions/20013144/convert-uiimage-to-nsdata-and-back-to-uiimage) – lazi74
- 1. Comparando dobles
- 2. Agregar UIImage encima de otro UIImage
- 3. ¿Rotar UIImage?
- 4. Comparando dos objetos.
- 5. C++: Comparando dos vectores
- 6. Comparando Uniones Discriminadas
- 7. Comparando C# y Java
- 8. comparando dos imágenes vectoriales
- 9. comparando cadenas en vb
- 10. Ruby comparando fechas
- 11. estructuras Comparando a NULL
- 12. Java - ¿Comparando clases?
- 13. Comparando backbone.js y Dojo
- 14. comparando 2 configuraciones phpinfo
- 15. Comparando listas en Lisp
- 16. Comparando con valores NULL
- 17. Comparando dos fechas
- 18. Comparando cadenas en EL
- 19. Arrays Java comparando
- 20. comparando cadenas en bash
- 21. Findbugs y comparando
- 22. C#: Comparando con nula
- 23. NSDate, comparando dos fechas
- 24. Python: Comparando listas
- 25. Comparando referencias en Java
- 26. Crear nueva UIImage añadiendo a la sombra UIImage existente
- 27. iPhone SDK - ¿Cómo dibujar un UIImage en otro UIImage?
- 28. Creando un UIImage de otro UIImage usando imageWithData devuelve nil
- 29. Cargando UIImage desde UIImagePickerControllerReferenceURL
- 30. Cómo recortar el UIImage?
Cuantificar "comparar". –
Compara los píxeles o mapas de bits para determinar si son iguales. – user377419