2010-01-03 6 views
6

से पिक्सेल और रंग प्राप्त करें मैंने एक एनएसआईमेज ऑब्जेक्ट बनाया है, और आदर्श यह निर्धारित करना चाहते हैं कि इसमें प्रत्येक पिक्सेल रंग कितने हैं। क्या यह संभव है?NSImage

उत्तर

9

मैं, अपने खुद के bitmap context बनाने एक graphics context में यह लपेटकर और स्थापित करने कि वर्तमान संदर्भ, telling the image to draw itself के रूप में, और उसके बाद पिक्सेल डेटा बिटमैप संदर्भ के पीछे तक पहुँचने सीधे सुझाव देते हैं।

यह अधिक कोड होगा, लेकिन आपको टीआईएफएफ प्रतिनिधित्व और हजारों या लाखों एनएससीओलर वस्तुओं के निर्माण के माध्यम से एक यात्रा दोनों बचाएगा। यदि आप किसी भी सराहनीय आकार की छवियों के साथ काम कर रहे हैं, तो ये खर्च जल्दी से जुड़ जाएंगे।

6

अपने NSImage से NSBitmapImageRep प्राप्त करें। फिर आप पिक्सल तक पहुंच प्राप्त कर सकते हैं।

NSImage* img = ...; 
NSBitmapImageRep* raw_img = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]]; 
NSColor* color = [raw_img colorAtX:0 y:0]; 
+3

यह एक बहुत ही महंगा तरीका है के रूप में 'colorAtX: y:', प्रत्येक पिक्सेल के लिए एक 'NSColor' उदाहरण बनाकर पीटर के रूप में शामिल होगी होसी नोट्स। कच्चे डेटा बफर को प्राप्त करने और हिस्टोग्राम की गणना करने के लिए पॉइंटर्स का उपयोग करके चलना बहुत अधिक कुशल है। – gavinb

+3

हाय गैविन, क्या आपके पास कोई दिशा है (कच्चे डेटा बफर प्राप्त करें और पॉइंटर्स का उपयोग करके चलें) इस पर? धन्यवाद! – RickON

+0

@ स्क्वायरलाइट ठीक है मुझे नहीं पता था कि मैं किसी को भी रहस्य में रख रहा था। मैंने एक नमूना ऐप लिखा जो ऊपर वर्णित है, और इस प्रश्न के उत्तर में कोड जोड़ा। मैंने इसे गिटूब पर भी प्रकाशित किया है। का आनंद लें! – gavinb

1

कोर छवि प्रलेखन में "हिस्टोग्राम" की तलाश करें।

2

इस कोड renders CGBitmapContext एक में NSImage:

- (void)updateImageData { 

    if (!_image) 
     return; 

    // Dimensions - source image determines context size 

    NSSize imageSize = _image.size; 
    NSRect imageRect = NSMakeRect(0, 0, imageSize.width, imageSize.height); 

    // Create a context to hold the image data 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 

    CGContextRef ctx = CGBitmapContextCreate(NULL, 
              imageSize.width, 
              imageSize.height, 
              8, 
              0, 
              colorSpace, 
              kCGImageAlphaPremultipliedLast); 

    // Wrap graphics context 

    NSGraphicsContext* gctx = [NSGraphicsContext graphicsContextWithCGContext:ctx flipped:NO]; 

    // Make our bitmap context current and render the NSImage into it 

    [NSGraphicsContext setCurrentContext:gctx]; 
    [_image drawInRect:imageRect]; 

    // Calculate the histogram 

    [self computeHistogramFromBitmap:ctx]; 

    // Clean up 

    [NSGraphicsContext setCurrentContext:nil]; 
    CGContextRelease(ctx); 
    CGColorSpaceRelease(colorSpace); 
} 

एक बिटमैप संदर्भ को देखते हुए, हम कच्चे छवि डेटा सीधे हिस्टोग्राम प्रत्येक रंग चैनल के लिए उपयोग कर सकते हैं, और गणना:

- (void)computeHistogramFromBitmap:(CGContextRef)bitmap { 

    // NB: Assumes RGBA 8bpp 

    size_t width = CGBitmapContextGetWidth(bitmap); 
    size_t height = CGBitmapContextGetHeight(bitmap); 

    uint32_t* pixel = (uint32_t*)CGBitmapContextGetData(bitmap); 

    for (unsigned y = 0; y < height; y++) 
    { 
     for (unsigned x = 0; x < width; x++) 
     { 
      uint32_t rgba = *pixel; 

      // Extract colour components 
      uint8_t red = (rgba & 0x000000ff) >> 0; 
      uint8_t green = (rgba & 0x0000ff00) >> 8; 
      uint8_t blue = (rgba & 0x00ff0000) >> 16; 

      // Accumulate each colour 
      _histogram[kRedChannel][red]++; 
      _histogram[kGreenChannel][green]++; 
      _histogram[kBlueChannel][blue]++; 

      // Next pixel! 
      pixel++; 
     } 
    } 
} 

@end 

मैंने एक पूर्ण परियोजना, कोको नमूना ऐप प्रकाशित किया है, जिसमें उपर्युक्त शामिल है।

0

NSBitmapImageRep साथ colorAtX का उपयोग करना हमेशा सटीक सही रंग के लिए नेतृत्व नहीं करता है।

मैं इस सरल कोड के साथ सही रंग पाने में कामयाब रहे:,

[yourImage lockFocus]; // yourImage is just your NSImage variable 
NSColor *pixelColor = NSReadPixel(NSMakePoint(1, 1)); // Or another point 
[yourImage unlockFocus];