1

下に表示されているUIImageViewがあります。画像内のすべてのブロックはサイズが異なります。画像の境界領域は定義されていません。ブロック領域の任意の場所に触れて特定のブロックを埋める必要があります.1つの白いブロックをクリックしたとしましょう特定の色で塗りつぶす必要があります。私の問題は、塗りつぶすブロックの境界をどのように検出できるかということです。タッチの位置を取得しますが、どの境界と比較するかによって、それは単なる画像であるため、どの領域を塗りつぶすべきかを知ることができます。

ここに画像の説明を入力

4

1 に答える 1

1

ここに画像の説明を入力

最後に、私は自分の問題を解決しました。

    @implementation FillBoxViewController

- (void)viewDidLoad
{
    [_imgView sizeToFit];
    [_imgView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight)];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch=[touches anyObject];
    CGPoint pt=[touch locationInView:self.view];

    CGContextRef ctx;
    CGImageRef imageRef = [_imgView.image CGImage];

    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);

    if (pt.y<height)
    {
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

        unsigned char *rawData = malloc(height * width * 4);

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

        //GET PIXEL FROM POINT

        int index = 4*(width*(round(pt.y))+(round(pt.x)));

        NSLog(@"index is %i",index);

        int R = rawData[index];
        int G = rawData[index+1];
        int B = rawData[index+2];

        NSLog(@"%d   %d   %d", R, G, B);

        //IF YOU WANT TO ALTER THE PIXELS

        for (int row=pt.y-20; row<=pt.y+20;++row)
        {
            for (int col=pt.x-20; col<=pt.x+20;++col)
            {
                int r,g,b;
                int byteIndex=4*(width*(round(row))+(round(col)));
                r=rawData[byteIndex];
                g=rawData[byteIndex+1];
                b=rawData[byteIndex+2];

                if ((r<R+10&&r>R-10) && (g<G+10&&g>G-10) && (b<B+10&&b>B-10)) {
                    rawData[byteIndex]=(char)(255);
                    rawData[byteIndex+1]=(char)(0);
                    rawData[byteIndex+2]=(char)(0);
                }
            }
        }

        ctx = CGBitmapContextCreate(rawData,
                                    CGImageGetWidth( imageRef ),
                                    CGImageGetHeight( imageRef ),
                                    8,
                                    CGImageGetBytesPerRow( imageRef ),
                                    CGImageGetColorSpace( imageRef ),
                                    kCGImageAlphaPremultipliedLast );

        imageRef = CGBitmapContextCreateImage(ctx);

        UIImage* rawImage = [UIImage imageWithCGImage:imageRef];  

        CGContextRelease(ctx);  

        _imgView.image = rawImage;

        free(rawData);
    }

    NSLog(@"touch detected at location (%f,%f)",pt.x,pt.y);
}

@end

ポイントで色をチェックする条件を適用し、境界外の四角形を塗りつぶすのを停止する色の変化をチェックします。画像はブロック内の色を正確に修正していないため、画像がそのように見えるため、RGBの範囲間の色のチェックを使用する必要があります画像に触れると色がつきます。

于 2013-02-28T12:51:00.397 に答える