2011-05-20 20 views
16

Bir CGImage'dan piksel verilerine erişmeye çalışıyorum. RGB değerlerine tamsayı olarak erişebilmek istiyorum.RGB piksel verilerini alma CGImage üzerinden

UIImage* theImage = [UIImage imageNamed:@"rgb.png"]; 
CGImageRef cgImageRef = CGImageRetain(theImage.CGImage); 
CFDataRef* imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImageRef)); 
NSLog(@"the data = %@", imageData); 

Bu da kaydeder:: Ben bu kodla neredeyse orada olduğumu düşünüyorum

data = < 010002fe fffdff02 0200fe04 0003fc>

görüntü 5x1 png içeren bir beyaz, siyah, Bu sırayla kırmızı, yeşil ve mavi piksel.

Gerçekten neye baktığımı anlamıyorum. Bir dizi RGB değeri veya benzer bir şeyi nasıl elde edebilirim, böylece onlarla çalışabilirim.

sayesinde Zengin

+0

olası yinelenen http://stackoverflow.com/questions/144250/how-to-get-the-rgb-values-for-a-pixel-on-an-image-on -the-iphone) – Rayfleck

cevap

55

Burada alakalı bir resim hakkında bilgi yanı sıra, görüntünün piksel verilerinin bir dökümü bir demet yazdırır bazı örnek kod. Alfa kanalları ile görüntülerin yanı sıra, görüntüler olmadan çalışacaktır. Kod, RGB renk alanında olmayan görüntülerde bile çalışır, ancak iOS'ta bunlardan herhangi birini elde edeceğinden şüpheliyim.

projenize içine kopyalayıp yapıştırın ve resim dosyalarını bir kaç karşı çalıştırmayı deneyin ve sonra belki de ihtiyaçlarınıza İşte

-(void)imageDump:(NSString*)file 
{ 
    UIImage* image = [UIImage imageNamed:file]; 
    CGImageRef cgimage = image.CGImage; 

    size_t width = CGImageGetWidth(cgimage); 
    size_t height = CGImageGetHeight(cgimage); 

    size_t bpr = CGImageGetBytesPerRow(cgimage); 
    size_t bpp = CGImageGetBitsPerPixel(cgimage); 
    size_t bpc = CGImageGetBitsPerComponent(cgimage); 
    size_t bytes_per_pixel = bpp/bpc; 

    CGBitmapInfo info = CGImageGetBitmapInfo(cgimage); 

    NSLog(
     @"\n" 
     "===== %@ =====\n" 
     "CGImageGetHeight: %d\n" 
     "CGImageGetWidth: %d\n" 
     "CGImageGetColorSpace: %@\n" 
     "CGImageGetBitsPerPixel:  %d\n" 
     "CGImageGetBitsPerComponent: %d\n" 
     "CGImageGetBytesPerRow:  %d\n" 
     "CGImageGetBitmapInfo: 0x%.8X\n" 
     " kCGBitmapAlphaInfoMask  = %s\n" 
     " kCGBitmapFloatComponents = %s\n" 
     " kCGBitmapByteOrderMask  = 0x%.8X\n" 
     " kCGBitmapByteOrderDefault = %s\n" 
     " kCGBitmapByteOrder16Little = %s\n" 
     " kCGBitmapByteOrder32Little = %s\n" 
     " kCGBitmapByteOrder16Big = %s\n" 
     " kCGBitmapByteOrder32Big = %s\n", 
     file, 
     (int)width, 
     (int)height, 
     CGImageGetColorSpace(cgimage), 
     (int)bpp, 
     (int)bpc, 
     (int)bpr, 
     (unsigned)info, 
     (info & kCGBitmapAlphaInfoMask)  ? "YES" : "NO", 
     (info & kCGBitmapFloatComponents) ? "YES" : "NO", 
     (info & kCGBitmapByteOrderMask), 
     ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrderDefault) ? "YES" : "NO", 
     ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder16Little) ? "YES" : "NO", 
     ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Little) ? "YES" : "NO", 
     ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder16Big) ? "YES" : "NO", 
     ((info & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Big) ? "YES" : "NO" 
    ); 

    CGDataProviderRef provider = CGImageGetDataProvider(cgimage); 
    NSData* data = (id)CGDataProviderCopyData(provider); 
    [data autorelease]; 
    const uint8_t* bytes = [data bytes]; 

    printf("Pixel Data:\n"); 
    for(size_t row = 0; row < height; row++) 
    { 
     for(size_t col = 0; col < width; col++) 
     { 
      const uint8_t* pixel = 
       &bytes[row * bpr + col * bytes_per_pixel]; 

      printf("("); 
      for(size_t x = 0; x < bytes_per_pixel; x++) 
      { 
       printf("%.2X", pixel[x]); 
       if(x < bytes_per_pixel - 1) 
        printf(","); 
      } 

      printf(")"); 
      if(col < width - 1) 
       printf(", "); 
     } 

     printf("\n"); 
    } 
} 

göre uyarlayabilir denedim iki görüntülerde bazı örnek çıktısı var . İkisi de 5x3 rgb. "A.png" görüntüsünde "b.rgb" bulunmazken bir alfa kanalı bulunur.

===== a.png ===== 
CGImageGetHeight: 5 
CGImageGetWidth: 3 
CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB) 
CGImageGetBitsPerPixel:  32 
CGImageGetBitsPerComponent: 8 
CGImageGetBytesPerRow:  20 
CGImageGetBitmapInfo: 0x00000003 
    kCGBitmapAlphaInfoMask  = YES 
    kCGBitmapFloatComponents = NO 
    kCGBitmapByteOrderMask  = NO 
    kCGBitmapByteOrderDefault = NO 
    kCGBitmapByteOrder16Little = NO 
    kCGBitmapByteOrder32Little = NO 
    kCGBitmapByteOrder16Big = NO 
    kCGBitmapByteOrder32Big = NO 
Pixel Data: 
(00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF) 
(00,00,00,FF), (FF,FF,FF,FF), (FF,00,00,FF), (00,FF,00,FF), (00,00,FF,FF) 
(FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00), (FF,FF,FF,00) 


===== b.png ===== 
CGImageGetHeight: 5 
CGImageGetWidth: 3 
CGImageGetColorSpace: <CGColorSpace 0x4d08ff0> (kCGColorSpaceDeviceRGB) 
CGImageGetBitsPerPixel:  24 
CGImageGetBitsPerComponent: 8 
CGImageGetBytesPerRow:  15 
CGImageGetBitmapInfo: 0x00000000 
    kCGBitmapAlphaInfoMask  = NO 
    kCGBitmapFloatComponents = NO 
    kCGBitmapByteOrderMask  = NO 
    kCGBitmapByteOrderDefault = NO 
    kCGBitmapByteOrder16Little = NO 
    kCGBitmapByteOrder32Little = NO 
    kCGBitmapByteOrder16Big = NO 
    kCGBitmapByteOrder32Big = NO 
Pixel Data: 
(00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) 
(00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) 
(00,00,00), (FF,FF,FF), (FF,00,00), (00,FF,00), (00,00,FF) 
[Bu] (arasında
+4

cevabınız için teşekkürler, bana çok yardımcı oldu :) – alexpov

+0

'bytes [row * bpr + col * bytes_per_pixel] Son kez böyle bir kod yazdım (kuşkusuz ki eskiden beri eskiden beri- standart donanım), her piksel için bunu yapmak büyük görüntüler için yavaştı. Bir işaretçiyi arttırmak ve çarpma yerine ekleme kullanmak daha hızlı olacaktır. Bunun büyük bir şey olmadığını düşünebilirsiniz, ancak büyük bir görüntü farkı yaratacak, bu pikseller hızlı bir şekilde toplanacak. – asveikau

+1

Bunun için teşekkürler, yararlı. Genişliği yükseklik olarak yazdırdığınızı fark ettim ve tam tersi. – user441669

İlgili konular