दिलचस्प पोस्ट
ImportError: DLL लोड विफल:% 1 वैध Win32 अनुप्रयोग नहीं है एंड्रॉइड: Google मैप्स एपीआई कुंजी साइनअप: एमडी 5 प्रमाणन कुंजी मैं nohup.out बिना नहुप कमांड का उपयोग कैसे करूं? निर्भरता नरक – कैसे गहराई से नेस्टेड ऑब्जेक्ट के लिए एक निर्भरता पास करता है? पायथन से जावा कॉलिंग डब्लूसीएफ: यूजरनामटोकन को नोड्स जोड़ना मैं नियंत्रण के खुद के परिवर्तन ईवेंट में से एक चयन बॉक्स चयन को प्रोग्राममैटिक रूप से कैसे बदल सकता हूं और यह मोबाइल ब्राउज़र में काम कर सकता है डीएफए के पूरक खोजना ggplot के qplot सोर्सिंग पर निष्पादित नहीं करता है मेरे जावास्क्रिप्ट ऑब्जेक्ट गुणों को अन्य उदाहरणों से अधिलेखित क्यों किया जा रहा है? एमवीसी रेजर @ वोरच छवियों को रिसाइज़ करने के लिए g.drawImage () विधि के प्रदर्शन में सुधार कैसे करें जावास्क्रिप्ट स्वैप सरणी तत्व एएसपी.नेट एमवीसी में चल रहे सर्वर कॉल के लिए प्रगति पट्टी स्पार्क डेटाफ़्रेम से नेस्टेड कॉलम को छोड़ना

कैसे iphone पर एक छवि पर एक पिक्सेल के लिए आरजीबी मूल्यों को पाने के लिए

मैं एक आईफ़ोन आवेदन लिख रहा हूं और फ़ोटोशॉप में 'आईडोप्रपर' टूल के बराबर कुछ आवश्यक रूप से कार्यान्वित करने की आवश्यकता है, जहां आप छवि पर एक बिंदु को स्पर्श कर सकते हैं और अपने रंग को निर्धारित करने और उसका मिलान करने के लिए प्रश्न में पिक्सेल के लिए आरजीबी मूल्यों को कैप्चर कर सकते हैं। UIImage प्राप्त करना आसान हिस्सा है, लेकिन क्या यूआईएमएज डेटा को बिटमैप प्रतिनिधित्व में बदलने का एक तरीका है जिसमें मैं किसी दिए गए पिक्सेल के लिए इस जानकारी को निकाल सकता हूं? एक कार्यशील कोड नमूना सबसे अधिक सराहना की जाएगी, और ध्यान दें कि मैं अल्फा मान से संबंधित नहीं हूँ।

Solutions Collecting From Web of "कैसे iphone पर एक छवि पर एक पिक्सेल के लिए आरजीबी मूल्यों को पाने के लिए"

थोड़ा और विस्तार …

मैंने इस शाम को पहले इस पोस्ट पर जो कुछ कहा गया था, उसको समेकन और छोटे जोड़ के साथ पोस्ट किया था – जो इस पोस्ट के निचले भाग में पाया जा सकता है। मैं इस बिंदु पर इस पोस्ट को संपादित कर रहा हूं, हालांकि, पोस्ट करने के लिए जो मैं प्रस्ताव देता हूं (कम से कम मेरी आवश्यकताओं के लिए, जिसमें पिक्सल डेटा संशोधित करना शामिल है) एक बेहतर तरीका है, क्योंकि यह लिखने योग्य डेटा प्रदान करता है (जब तक कि मैं इसे समझता हूं, पिछली पोस्ट और इस पोस्ट के निचले भाग में डेटा के लिए केवल-पढ़ने के संदर्भ प्रदान करता है)

विधि 1: लेखन पिक्सेल जानकारी

  1. मैं स्थिरांक परिभाषित

    #define RGBA 4 #define RGBA_8_BIT 8 
  2. मेरे UIImage subclass में मैंने घोषित आवृत्ति को घोषित किया:

     size_t bytesPerRow; size_t byteCount; size_t pixelCount; CGContextRef context; CGColorSpaceRef colorSpace; UInt8 *pixelByteData; // A pointer to an array of RGBA bytes in memory RPVW_RGBAPixel *pixelData; 
  3. पिक्सेल स्ट्रेट (इस संस्करण में अल्फा के साथ)

     typedef struct RGBAPixel { byte red; byte green; byte blue; byte alpha; } RGBAPixel; 
  4. बिटमैप फ़ंक्शन (पूर्व-गणना वाली आरजीबीए देता है; आरजीबी द्वारा आरजीबी प्राप्त करने के लिए आरजीबी को विभाजित करें):

     -(RGBAPixel*) bitmap { NSLog( @"Returning bitmap representation of UIImage." ); // 8 bits each of red, green, blue, and alpha. [self setBytesPerRow:self.size.width * RGBA]; [self setByteCount:bytesPerRow * self.size.height]; [self setPixelCount:self.size.width * self.size.height]; // Create RGB color space [self setColorSpace:CGColorSpaceCreateDeviceRGB()]; if (!colorSpace) { NSLog(@"Error allocating color space."); return nil; } [self setPixelData:malloc(byteCount)]; if (!pixelData) { NSLog(@"Error allocating bitmap memory. Releasing color space."); CGColorSpaceRelease(colorSpace); return nil; } // Create the bitmap context. // Pre-multiplied RGBA, 8-bits per component. // The source image format will be converted to the format specified here by CGBitmapContextCreate. [self setContext:CGBitmapContextCreate( (void*)pixelData, self.size.width, self.size.height, RGBA_8_BIT, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast )]; // Make sure we have our context if (!context) { free(pixelData); NSLog(@"Context not created!"); } // Draw the image to the bitmap context. // The memory allocated for the context for rendering will then contain the raw image pixelData in the specified color space. CGRect rect = { { 0 , 0 }, { self.size.width, self.size.height } }; CGContextDrawImage( context, rect, self.CGImage ); // Now we can get a pointer to the image pixelData associated with the bitmap context. pixelData = (RGBAPixel*) CGBitmapContextGetData(context); return pixelData; } 

केवल पढ़ने के लिए डेटा (पिछला सूचना) – विधि 2:


चरण 1. मैंने बाइट के लिए एक प्रकार घोषित किया:

  typedef unsigned char byte; 

चरण 2. मैंने एक पिक्सेल के अनुरूप एक स्ट्रैट घोषित किया:

  typedef struct RGBPixel{ byte red; byte green; byte blue; } RGBPixel; 

चरण 3. मैं UIImageView subclassed और (संश्लेषित संश्लेषित गुणों के साथ) घोषित:

 // Reference to Quartz CGImage for receiver (self) CFDataRef bitmapData; // Buffer holding raw pixel data copied from Quartz CGImage held in receiver (self) UInt8* pixelByteData; // A pointer to the first pixel element in an array RGBPixel* pixelData; 

चरण 4. उप-कोड मैं बिटमैप नामक एक विधि में डाल दिया (बिटमैप पिक्सेल डेटा वापस करने के लिए):

 //Get the bitmap data from the receiver's CGImage (see UIImage docs) [self setBitmapData: CGDataProviderCopyData(CGImageGetDataProvider([self CGImage]))]; //Create a buffer to store bitmap data (unitialized memory as long as the data) [self setPixelBitData:malloc(CFDataGetLength(bitmapData))]; //Copy image data into allocated buffer CFDataGetBytes(bitmapData,CFRangeMake(0,CFDataGetLength(bitmapData)),pixelByteData); //Cast a pointer to the first element of pixelByteData //Essentially what we're doing is making a second pointer that divides the byteData's units differently - instead of dividing each unit as 1 byte we will divide each unit as 3 bytes (1 pixel). pixelData = (RGBPixel*) pixelByteData; //Now you can access pixels by index: pixelData[ index ] NSLog(@"Pixel data one red (%i), green (%i), blue (%i).", pixelData[0].red, pixelData[0].green, pixelData[0].blue); //You can determine the desired index by multiplying row * column. return pixelData; 

चरण 5. मैंने एक एक्सेसर विधि बनाया है:

 -(RGBPixel*)pixelDataForRow:(int)row column:(int)column{ //Return a pointer to the pixel data return &pixelData[row * column]; } 

यहाँ एक UIImage के नमूने रंग के लिए मेरा समाधान है।

यह दृष्टिकोण अनुरोधित पिक्सेल को 1px बड़े आरजीबीए बफर में प्रस्तुत करता है और परिणामी रंग मान को एक UIColor ऑब्जेक्ट के रूप में देता है। यह मैंने देखा है और केवल बहुत छोटी मेमोरी का उपयोग करता है I

यह एक रंग पिकर की तरह कुछ के लिए बहुत अच्छी तरह से काम करना चाहिए, जहां आपको आमतौर पर किसी भी समय किसी विशेष पिक्सेल के मूल्य की आवश्यकता होती है।

UIImage + Picker.h

 #import <UIKit/UIKit.h> @interface UIImage (Picker) - (UIColor *)colorAtPosition:(CGPoint)position; @end 

UIImage + Picker.m

 #import "UIImage+Picker.h" @implementation UIImage (Picker) - (UIColor *)colorAtPosition:(CGPoint)position { CGRect sourceRect = CGRectMake(position.x, position.y, 1.f, 1.f); CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, sourceRect); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); unsigned char *buffer = malloc(4); CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big; CGContextRef context = CGBitmapContextCreate(buffer, 1, 1, 8, 4, colorSpace, bitmapInfo); CGColorSpaceRelease(colorSpace); CGContextDrawImage(context, CGRectMake(0.f, 0.f, 1.f, 1.f), imageRef); CGImageRelease(imageRef); CGContextRelease(context); CGFloat r = buffer[0] / 255.f; CGFloat g = buffer[1] / 255.f; CGFloat b = buffer[2] / 255.f; CGFloat a = buffer[3] / 255.f; free(buffer); return [UIColor colorWithRed:r green:g blue:b alpha:a]; } @end 

आप सीधे UIImage के बिटमैप डेटा तक पहुंच नहीं सकते हैं।

आपको UIImage के CGImage प्रतिनिधित्व प्राप्त करने की आवश्यकता है। तब CGImage डेटा प्रदाता प्राप्त करें, उस से बिटमैप का एक CFData प्रतिनिधित्व। जब किया जाए तो CFData को जारी करना सुनिश्चित करें

 CGImageRef cgImage = [image CGImage]; CGDataProviderRef provider = CGImageGetDataProvider(cgImage); CFDataRef bitmapData = CGDataProviderCopyData(provider); 

पिक्सेल ऑर्डर, छवि आयाम आदि प्राप्त करने के लिए संभवतः आप सीजीआईमेज की बिटमैप जानकारी देखना चाहेंगे।

लाजोस का जवाब मेरे लिए काम किया पिक्सल डेटा को बाइट्स की एक सरणी के रूप में प्राप्त करने के लिए, मैंने यह किया था:

UInt8* data = CFDataGetBytePtr(bitmapData);

अधिक जानकारी: CFDataRef प्रलेखन

इसके अलावा, CoreGraphics.framework को शामिल करना याद रखें

सबको धन्यवाद! इनमें से कुछ जवाब एक साथ रखकर मुझे मिलते हैं:

 - (UIColor*)colorFromImage:(UIImage*)image sampledAtPoint:(CGPoint)p { CGImageRef cgImage = [image CGImage]; CGDataProviderRef provider = CGImageGetDataProvider(cgImage); CFDataRef bitmapData = CGDataProviderCopyData(provider); const UInt8* data = CFDataGetBytePtr(bitmapData); size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); size_t width = CGImageGetWidth(cgImage); size_t height = CGImageGetHeight(cgImage); int col = px*(width-1); int row = py*(height-1); const UInt8* pixel = data + row*bytesPerRow+col*4; UIColor* returnColor = [UIColor colorWithRed:pixel[0]/255. green:pixel[1]/255. blue:pixel[2]/255. alpha:1.0]; CFRelease(bitmapData); return returnColor; } 

यह सिर्फ एक्स और वाई दोनों के लिए एक बिंदु सीमा 0.0-1.0 लेता है। उदाहरण:

 UIColor* sampledColor = [self colorFromImage:image sampledAtPoint:CGPointMake(px/imageView.frame.size.width, py/imageView.frame.size.height)]; 

यह मेरे लिए महान काम करता है मैं बिट पिक्सल और आरजीबीए रंगों की तरह कुछ मान्यताओं को बना रहा हूं, लेकिन यह ज्यादातर मामलों के लिए काम करना चाहिए।

एक अन्य नोट – यह मेरे लिए सिम्युलेटर और डिवाइस दोनों पर काम कर रहा है – मेरे पास पीएनजी ऑप्टिमाइज़ेशन के कारण अतीत में समस्याएं हैं, जो डिवाइस पर चलने के बाद हुई थीं।

मेरे आवेदन में कुछ इसी तरह से करने के लिए, मैंने एक छोटे ऑफ-स्क्रीन CGImageContext बनाया, और उसके बाद इसमें UIImage का अनुवाद किया। इससे मुझे एक बार में कई पिक्सेल निकालने का एक तेज़ तरीका हो गया इसका मतलब यह है कि आप एक प्रारूप में लक्ष्य बिटमैप को सेट कर सकते हैं जिसे आप पार्स करना आसान पाते हैं, और कोर ग्राफिक्स रंग मॉडल या बिटमैप प्रारूपों के बीच परिवर्तित करने के लिए कड़ी मेहनत करते हैं।

मैं नहीं जानता कि कैसे एक्सएम, वाई कॉर्डिनेशन के आधार पर छवि डेटा में सही तरीके से सूचकांक क्या कोई जानता है?

पिक्सेल पोजीशन = (एक्स + (वाई * ((छविवादिता) * बाइटपेरपिक्सेल)));

// पिच इस डिवाइस के साथ एक मुद्दा नहीं है जहाँ तक मुझे पता है और शून्य हो सकता है … // (या गणित से बाहर खींच लिया)।

ANImageBitmapRep का उपयोग करें जो पिक्सेल-स्तरीय पहुंच देता है (पढ़ें / लिखें)।