私はしばらくの間、次のことを試みてきました、
- プレーヤーが画面をタップします
- プレーヤーがタップしたピクセルの値を取得します
- 画像をループして、同じピクセルを見つけます。すべて作成
- 同じ値のピクセルのアルファ値が0の場合、新しい画像を作成し、
- UIImageを新しく作成したものとして設定します
- ..。
- 利益
しかし、タイトルが示すように、完全に黒い画面であるか、画像がまったくないかのいずれかです...おそらくすべてのアルファを0に設定するか、この関数の近くのスタックでの不正アクセスに関する何かをクラッシュさせますCGSConvertBGRX8888toRGBA8888
これが機能です
+ (UIImage*)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy
{{
// First get the image into your data buffer
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
NSUInteger bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
NSUInteger bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
NSUInteger bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = (unsigned char*) malloc(height * width * 4);
CGContextRef context = CGBitmapContextCreate(rawData,
width,
height,
bitsPerComponent,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextClearRect(context, CGRectMake(0, 0, width, height));
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
//convert phone screen coords to texture coordinates.
xx *= width/320;
yy *= height/480;
int counter = 0;
// Now your rawData contains the image data in the RGBA8888 pixel format.
// Get the byteIndex of pixel tapped.
int byteIndex = (bytesPerRow * yy) + xx * bitsPerPixel;
CGFloat red = (rawData[byteIndex] * 1.0) / 255.0;
CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0;
CGFloat blue = (rawData[byteIndex + 2] * 1.0) / 255.0;
CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0;
byteIndex += 4;
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
byteIndex = ( width * y ) + x * bitsPerPixel;
CGFloat redVal = ( rawData[byteIndex] * 1.0) / 255.0;
CGFloat greenVal = ( rawData[byteIndex + 1] * 1.0) / 255.0;
CGFloat blueVal = ( rawData[byteIndex + 2] * 1.0) / 255.0;
CGFloat alphaVal = ( rawData[byteIndex + 3] * 1.0) / 255.0;
byteIndex += 4;
if( alphaVal != 0 )
{
if( redVal == red && greenVal == green && blueVal == blue )
{
rawData[byteIndex + 3] = 0;
counter ++;
}
}
}
}
NSLog(@"Pixels amount: %i", counter);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
rawData,
width*height*4,
NULL);
CGImageRef newCGimage = CGImageCreate( width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorSpace,
kCGBitmapByteOrderDefault,
provider,
NULL, NO, kCGRenderingIntentDefault );
UIImage *newImage = [UIImage imageWithCGImage:newCGimage];
CGDataProviderRelease(provider);
CGImageRelease(newCGimage);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
free(rawData);
return newImage;
}
いくつかのテストで正しいピクセルを取得し、選択した色をビューに出力して、その部分が正常に機能しているように見えることはかなり確信しています。生データを編集した後に画像を作成しているときのようです。少なくとも、ここで問題はあると思います。
よろしくお願いします。
編集:
これでコードを削除したので、基本的にpngを生データにコピーしてUIImageを作成し、設定します。基本的に、まったく同じ画像を取得し、何も変更しないでください。しかし、今回は、すべての値が0であるか、アルファが0であるために消えてしまいます。編集されたコードが、次のようになっているのかわかりません。
// First get the image into your data buffer
CGImageRef imageRef = [image CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
NSUInteger bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
NSUInteger bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
NSUInteger bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
CGBitmapInfo imageInfo = CGImageGetBitmapInfo(imageRef);
unsigned char *rawData = (unsigned char*) malloc(height * width * 4);
CGContextRef context = CGBitmapContextCreate(rawData,
width,
height,
bitsPerComponent,
bytesPerRow,
colorSpace,
imageInfo);
//convert phone screen coords to texture coordinates.
xx *= (width/[[UIScreen mainScreen] bounds].size.width);
yy *= (height/[[UIScreen mainScreen] bounds].size.height);
NSLog(@"converted X pos: %i",xx);
NSLog(@"converted Y pos: %i",yy);
int counter = 0;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
rawData,
width*height*4,
NULL);
CGImageRef newCGimage = CGImageCreate( width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorSpace,
imageInfo,
provider,
NULL, NO, kCGRenderingIntentDefault );
UIImage *newImage = [[UIImage alloc]initWithCGImage:newCGimage];
CGDataProviderRelease(provider);
CGImageRelease(newCGimage);
CGContextRelease(context);
free(rawData);
return newImage;