Как я могу манипулировать значениями пикселей в CGImageRef в XCode

У меня есть немного

CGImageRef cgImage = "something"

Есть ли способ манипулировать значениями пикселей этого cgImage? Например, если это изображение содержит значения от 0,0001 до 3000, то есть, когда я пытаюсь просмотреть или выпустить изображение таким образом в NSImageView ( Как я могу показать изображение в NSView, используя изображение CGImageRef)

Я получаю черное изображение, все пиксели черные, я думаю, что это связано с настройкой значений диапазона пикселей в другой цветовой карте (я не знаю).

Я хочу иметь возможность манипулировать или изменять значения пикселей или просто видеть изображение, манипулируя диапазоном цветовой карты.

Я пробовал это, но, очевидно, это не работает:

CGContextDrawImage(ctx, CGRectMake(0,0, CGBitmapContextGetWidth(ctx),CGBitmapContextGetHeight(ctx)),cgImage); 
UInt8 *data = CGBitmapContextGetData(ctx);

for (**all pixel values and i++ **) {
        data[i] = **change to another value I want depending on the value in data[i]**;
        }

Спасибо,

1 ответ

Решение

Для того, чтобы манипулировать отдельными пикселями в изображении

  • выделить буфер для хранения пикселей
  • создать контекст растрового изображения памяти, используя этот буфер
  • нарисовать изображение в контексте, который помещает пиксели в буфер
  • изменить пиксели по желанию
  • создать новое изображение из контекста
  • высвободить ресурсы (обратите внимание, обязательно проверяйте наличие утечек с помощью инструментов)

Вот пример кода, с которого можно начать. Этот код поменяет местами синий и красный компоненты каждого пикселя.

- (CGImageRef)swapBlueAndRedInImage:(CGImageRef)image
{
    int x, y;
    uint8_t red, green, blue, alpha;
    uint8_t *bufptr;

    int width  = CGImageGetWidth( image );
    int height = CGImageGetHeight( image );

    // allocate memory for pixels
    uint32_t *pixels = calloc( width * height, sizeof(uint32_t) );

    // create a context with RGBA pixels
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate( pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast );

    // draw the image into the context
    CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image );

    // manipulate the pixels
    bufptr = (uint8_t *)pixels;
    for ( y = 0; y < height; y++)
        for ( x = 0; x < width; x++ )
        {
            red   = bufptr[3];
            green = bufptr[2];
            blue  = bufptr[1];
            alpha = bufptr[0];

            bufptr[1] = red;        // swaps the red and blue
            bufptr[3] = blue;       // components of each pixel

            bufptr += 4;
        }    

    // create a new CGImage from the context with modified pixels
    CGImageRef resultImage = CGBitmapContextCreateImage( context );

    // release resources to free up memory
    CGContextRelease( context );
    CGColorSpaceRelease( colorSpace );
    free( pixels );

    return( resultImage );
}
Другие вопросы по тегам