0

私の目標は次のとおりです。

プレーヤーが画面に触れると、プログラムはそのタッチ位置のピクセルの値を見つけて、すべてのピクセルをループし、まったく同じRGBA値のものが編集されます。現時点では、それらをすべて非表示にするには、アルファを0にします。

これまでのところ、タッチしたピクセルに対応するものを見つけるために情報を削除することができましたが、ピクセルを設定し、新しいデータからUIImageを作成して設定すると、何も変わりません。

少しの助けをいただければ幸いです。

コードは次のとおりです

機能のために

(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);

//convert phone screen coords to texture coordinates.
xx *= width/[[UIScreen mainScreen] bounds].size.width;
yy *= height/[[UIScreen mainScreen] bounds].size.height;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;


CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                             bitsPerComponent, bytesPerRow, colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(context);

/*                             MY STUFF                                     */
int counter = 0;
/*                             MY STUFF                                     */

// Now your rawData contains the image data in the RGBA8888 pixel format.
// Get the byteIndex of pixel tapped.

int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;

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 = (x + (y * width)) * bytesPerPixel;

        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]     = 255; 
                rawData[byteIndex + 1] = 255; 
                rawData[byteIndex + 2] = 255; 
                rawData[byteIndex + 3] = 1; 
                counter ++;
            }
        }
    }
}

UIImage *newImage = [UIImage imageWithCGImage: imageRef];
image = newImage;

NSLog(@"Pixels amount: %i", counter);


free(rawData);

return image;

そしてそれはそのように呼ばれます

 tempBGRef.image = [MainMenuViewController getRGBAsFromImage:[tempBGRef image] atX:touchPointInView.x andY:touchPointInView.y]; 
4

2 に答える 2

0

私はあなたがこれを見るべきであるというあなたの目的によって行くと思います

このページは中国語ですが、緑色のボックスを開いた場合は、zipファイルをダウンロードする必要があります。歪曲技術を使用して背景を編集します。タッチ検出を見ると、プロジェクトの優れた基盤があるはずです。

それがお役に立てば幸いです。

于 2012-07-09T10:18:02.760 に答える
0

rawDataオブジェクトを変更しますが、imageRefに含まれるデータではありません。imageRefデータをrawDataオブジェクトにコピーしましたが、rawData値を変更してもimageRefは更新されません。rawData配列から新しいCGImageオブジェクトを作成するには、 CGImageCreateメソッドを呼び出す必要があります。

于 2012-07-09T10:19:12.047 に答える