Редактирование значения Iphone Pixel RGBA

Моя цель следующая.

Когда игрок касается экрана, программа должна определить значения пикселя в этом месте касания, а затем перебрать каждый пиксель, и все, которые имеют точно такие же значения RGBA, будут отредактированы, в тот момент, когда я просто хочу установить альфа до 0, чтобы сделать их всех невидимыми.

Пока мне удалось удалить информацию, чтобы выяснить, какие из них соответствуют затронутому пикселю, но когда я устанавливаю пиксели и создаю UIImage из новых данных и устанавливаю его. Ничего не меняется.

Небольшая помощь будет очень признательна.

код следует

для функции

(UIImage *) getRGBAsFromImage: (UIImage *) изображение 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]; 

person Genhain    schedule 09.07.2012    source источник


Ответы (2)


Вы изменяете объект rawData, но он не содержит данных imageRef. Вы скопировали данные imageRef в объект rawData, но imageRef не обновляется при изменении значений rawData. Вы должны вызвать CGImageCreate, чтобы создать новый объект CGImage из вашего массива rawData.

person Ivan Nikitin    schedule 09.07.2012
comment
Ура ... К сожалению, у него много полей, в которых мне придется разобраться. если нет такого, который принимает только массив rawdata - person Genhain; 09.07.2012

Я думаю, исходя из своей цели, вам следует взглянуть на это

Страница на китайском языке, но если вы откроете зеленое поле, вам следует загрузить zip-файл. Он использует методы искажения для редактирования фона. Если вы посмотрите на распознавание касаний, у вас должна быть хорошая база для вашего проекта.

Надеюсь, это поможет.

person user1432813    schedule 09.07.2012