Как я могу манипулировать значениями пикселей в 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 );
}