32-битное изображение в градациях серого с CGBitmapContextСоздать всегда черный - PullRequest
1 голос
/ 29 марта 2011

Я использую следующий код для отображения 32-битного изображения в градациях серого. Даже если я явно установлю для каждого пикселя значение 4294967297 (которое должно быть белым), конечный результат всегда будет черным. Что я здесь не так делаю? Изображение всего 64х64 пикселей.

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
ptr = (float*)malloc(4*xDim*yDim);
for(i=0;i<yDim;i++)
{
    for(j=0;j<xDim;j++)
    {
        ptr[i*xDim + j] = 4294967297;
    }
}
CGContextRef bitmapContext = CGBitmapContextCreate(
                                                   ptr,
                                                   xDim,
                                                   yDim,
                                                   32,
                                                   4*xDim,
                                                   colorSpace,
                                                   kCGImageAlphaNone | kCGBitmapFloatComponents);

//ptr = CGBitmapContextGetData(bitmapContext);


//NSLog(@"%ld",sizeof(float));

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);

NSRect drawRect;
drawRect.origin = NSMakePoint(1.0, 1.0);
drawRect.size.width = 64;
drawRect.size.height = 64;
NSImage *greyscale = [[NSImage alloc] initWithCGImage:cgImage size:NSZeroSize];
[greyscale drawInRect:drawRect
             fromRect:NSZeroRect
            operation:NSCompositeSourceOver
             fraction:1.0];

Ответы [ 4 ]

1 голос
/ 07 декабря 2011

Если вы не укажете порядок байтов, то по умолчанию Quartz будет иметь значение байтов.Если вы используете Intel Mac, это будет неправильно.Вам нужно будет явно указать порядковый номер, и лучший способ сделать это - изменить флаги на:

kCGImageAlphaNone | kCGBitmapFloatComponents | kCGBitmapByteOrder32Host

Это будет работать правильно независимо от вашего процессора (для будущей совместимости!).Вы можете найти более подробную информацию здесь: http://lists.apple.com/archives/Quartz-dev/2011/Dec/msg00001.html

0 голосов
/ 19 августа 2013

32-битная серая шкала с плавающей точкой не поддерживается CGBitmapContextCreate. CGBitmapContextCreate Поддерживаемые цветовые пространства

0 голосов
/ 07 декабря 2011

Показываете ли вы точный код, который используете?

2 ^ 32 - 1 = 4294967295

Если вы используете 4294967297, я подозреваю, что вы получаете переполнение и фактическое значение 2!

0 голосов
/ 09 октября 2011

Вы используете изображение с плавающей запятой.Убедитесь, что ptr имеет тип float *, и попробуйте установить значения 0,5f вместо 4294967297.

...