cevap
İki UIImages'niz varsa, bu nesnelerden CGImageRef
kuvars temsillerini almalısınız. Ardından, görüntülerin her biri için bir tane oluşturduğunuz ve geçirdiğiniz bellek arabelleği tarafından desteklenen iki yeni bitmap bağlamı oluşturun. Ardından görüntüleri bitmap bağlamlarına çizmek için CGContextDrawImage
kullanın. Artık görüntülerin baytları tamponlarda. Farklılıkları kontrol etmek için manuel olarak veya memcmp
ile döngü yapabilirsiniz.
Apple'ın kendi ayrıntılı açıklama ve örnek kod etrafında bitmap bağlamları oluşturma ve içlerine çizim buradadır:
sizin için fark bağlam içine varolan görüntü çizim olmamız. Bunun için CGContextDrawImage
kullanın. Burada
Whoaaaa ... Bu biraz kafa karıştırıcı bir şey aramayacağım (aslında bundan öğrenmek istiyorum) ama bazı kodlar gönderebilirdiniz. Gerçekten herhangi bir CG yöntemi ile çerçeveler değilim .. Veya en azından bir noob için daha iyi açıklamaya çalışın. – user377419
İyi bilgilere bir bağlantı ekledim. Hala başınızın biraz üzerindeyse, Çekirdek Grafiklerin temelleri hakkında eğitici ve Apple'ın dokümanlarını inceleyin. Burada SO'da bir soru olarak cevaplamak için çok büyük bir konu var ve eğer iOS üzerinde önemli bir imaj çalışması yapıyorsanız bunu anlamanız gerekiyor. –
Erhm Bu kafa karıştırıcıydı ... Birisi bunu sadece ikili görüntüye dönüştürebileceğinizi ya da sadece gri tonlamalı olarak değiştirebileceğinizi ve bunu karşılaştırabileceğinizi söyledi. Bunu yapabilir miyim? – user377419
'ın kod örneği
-(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;
}
Bu benim görüntüleri karşılaştırmak için benim birim testlerinde kullanmak budur. Diğer yöntemlerden farklı olarak (örneğin, UIImagePNGRepresentation
), görüntüler farklı bir renk alanına (örneğin RGB ve gri tonlamalı) sahip olsa bile çalışır.
@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
Çok verimli değil, öyleyse performans sorunu değil sürece üretim kodunda kullanılmamasını öneriyoruz.
Tam özgeçmiş: https://gist.github.com/hpique/dedb719817ac8c50afea – hpique
eğer bir UIImage ise, önce UIImagePNGRepresment'i doğrudan çizmeden arayabilirsiniz. Ayrıca bakınız [UIImage'ı NSData'ya ve UIImage'a dönüştürün] (http://stackoverflow.com/questions/20013144/convert-uiimage-to-nsdata-and-back-to-uiimage) – lazi74
- 1. UIImage
- 2. UIImage imageWithData
- 3. Karşılaştırma ActionBarSherlock
- 4. ilişki/karşılaştırma?
- 5. Karşılaştırma operatörleri
- 6. Nesneleri karşılaştırma
- 7. YCSB Karşılaştırma
- 8. NSDates'i Karşılaştırma
- 9. UIImage, UIImage URL'den yüklendiğinde UITableViewCell'de UIImageView Boyutunu Ayarla?
- 10. NSData'dan UiImage oluştur
- 11. UIImage kenarlığı ayarlama
- 12. UIImage çerçevesi nasıl ayarlanır
- 13. UIBezierPath Saydamlık UIImage çevresinde
- 14. CIImage öğesinden UIImage oluşturma
- 15. ios8 UIImage imageNamed: crash
- 16. Bir UIImage nasıl kopyalanır?
- 17. Görünüm katmanlarından UIImage alın?
- 18. UIImage initWithContentsOfFile çalışmıyor
- 19. UIImage: dolgu arka plan
- 20. Bellek Harita UIImage
- 21. UIView'i UIImage olarak yakalama
- 22. UIImage ve resizableImageWithCapInsets Swift
- 23. Alma UIImage UIImageView Swift
- 24. UIView bir bölgesinden UIImage
- 25. UIImage çarpışma etkisi ... ??? Iphone
- 26. Bir UIImage dosyası, (Swift)
- 27. AVFoundation ele geçirme UIImage
- 28. NSOutputStream üzerinden UIImage gönderme
- 29. UIImage ikiye bölünmüş mü?
- 30. UIImage boyutunu nasıl küçültün ...?
"Karşılaştır" seçeneğini belirleyin. –
Aynı olup olmadıklarını belirlemek için piksel veya bitmapleri karşılaştırın. – user377419