2012-05-02 14 views
4

スケーリングと移動後にUIimageのピクセルデータを取得するには、CGImageピクセルデータを取得してからCGImage Pixel DataからUIImageを取得することをお勧めします。CGImageからRawピクセルデータを取得する方法

+0

私はいくつかのコードをpastebinで提供できますか? –

答えて

10

あなたはこのようなピクセルをステップ実行することができます

CFDataRef rawData = CGDataProviderCopyData(CGImageGetDataProvider(aCGImageRef)); 

を呼び出すことにより、生データを取得することができます:

UInt8 * buf = (UInt8 *) CFDataGetBytePtr(rawData); 
CFIndex length = CFDataGetLength(rawData); 

for(unsigned long i=0; i<length; i+=4) 
{ 
    int r = buf[i]; 
    int g = buf[i+1]; 
    int b = buf[i+2]; 
    } 
CFRelease(rawData); 
+0

CFDataGetLengthの参照変数は何ですか – user1362790

+1

このバッファからUIImageを取得するにはどうすればいいですか? – user1362790

+0

私はこのようなコードを持っています。CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider (collisionImage.CGImage)); const UInt32 * pixels =(const UInt32 *)CFDataGetBytePtr(imageData);ピクセルを使用して画像を再作成する方法 – user1362790

0

はこれを試してみてください。これにより、画像の選択されたピクセルのオフセット、アルファ、RGBカラーなどが表示されます。

ソースコード: -

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [[event allTouches] anyObject]; 

CGPoint startLocation = [touch locationInView:self.view]; 

    if ([touch view] == YourImageView) 
    { 
     CGPoint location = [touch YourImageView]; 
     [self getPixelColorAtLocation:location]; 
     if((alpha==255)||(alpha==0)) 
     { 
      //perform Your task 
     } 
    } 
} 


- (UIColor*) getPixelColorAtLocation:(CGPoint)point 
{ 

UIColor* color = nil; 

CGImageRef inImage; 

inImage = YourImageView.image.CGImage; 


// Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue 
CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage]; 
if (cgctx == NULL) { return nil; /* error */ } 

size_t w = CGImageGetWidth(inImage); 
size_t h = CGImageGetHeight(inImage); 
CGRect rect = {{0,0},{w,h}}; 


// 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(cgctx, rect, inImage); 

// Now we can get a pointer to the image data associated with the bitmap 
// context. 
unsigned char* data = CGBitmapContextGetData (cgctx); 
if (data != NULL) { 
    //offset locates the pixel in the data from x,y. 
    //4 for 4 bytes of data per pixel, w is width of one row of data. 
    int offset = 4*((w*round(point.y))+round(point.x)); 
    alpha = data[offset]; 
    int red = data[offset+1]; 
    int green = data[offset+2]; 
    int blue = data[offset+3]; 
    NSLog(@"offset: %i colors: RGB A %i %i %i %i",offset,red,green,blue,alpha); 
    color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)]; 
} 

// When finished, release the context 
//CGContextRelease(cgctx); 
// Free image data memory for the context 
if (data) { free(data); } 

return color; 
} 

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef)inImage 
{ 
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(inImage); 
size_t pixelsHigh = CGImageGetHeight(inImage); 

// 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); 
bitmapByteCount  = (bitmapBytesPerRow * pixelsHigh); 

// Use the generic RGB color space. 
colorSpace = CGColorSpaceCreateDeviceRGB(); 

if (colorSpace == NULL) 
{ 
    fprintf(stderr, "Error allocating color space\n"); 
    return NULL; 
} 

// 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 (bitmapData, 
           pixelsWide, 
           pixelsHigh, 
           8,  // bits per component 
           bitmapBytesPerRow, 
           colorSpace, 
           kCGImageAlphaPremultipliedFirst); 
if (context == NULL) 
{ 
    free (bitmapData); 
    fprintf (stderr, "Context not created!"); 
} 

// Make sure and release colorspace before returning 
CGColorSpaceRelease(colorSpace); 

return context; 
} 

はそれがお役に立てば幸いです。ありがとう:)

+0

実際には画像の全ピクセルが必要ですが、画像をNSDataまたはCFDataRefに保存する必要があります。次にNSDataとCFDataRefから別のコントローラの画像を取得します。助けて。 – user1362790

+0

NSDataからイメージを取得するには、次のようにします。 - NSData * imageData = UIImagePNGRepresentation(yourUIImage); uiImage = [UIImage imageWithData:imageData]; –

+0

しかし、NSDataに保存できないスケーリングされたイメージとNSDataを使用してスケーリングされたイメージを取得できない場合は、元のデータも格納されていれば、スケーリングされたデータが必要です – user1362790

関連する問題