2016-07-18 9 views
0

Очень странное поведение, но я сузил проблему вниз, насколько я могу идти, я думаю, чтоПри создании CGImage с массивом декодирования, на выходе имеет все эти пиксели компенсировано небольшое количество

У меня есть NSImage, назовем его inputImage. Он представлен NSBitmapImageRep в CGColorSpaceCreateDeviceGray, если это имеет значение

Я хочу создать из него CGImageRef, но с перевернутыми цветами.

NSData *data = [inputImage TIFFRepresentation]; 
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    NSBitmapImageRep *maskedRep = (NSBitmapImageRep*)[inputImage representations][0]; 
    CGFloat decode[] = {0.0, 1.0}; 

    maskRef = CGImageMaskCreate(maskedRep.pixelsWide, 
           maskedRep.pixelsHigh, 
           8, 
           maskedRep.bitsPerPixel, 
           maskedRep.bytesPerRow, 
           provider, 
           decode, 
           false); 

    NSImage *testImage = [[NSImage alloc] initWithCGImage:maskRef size:NSMakeSize(1280,1185)]; //the size of the image, hard-coded for testing 
    NSLog(@"testimage: %@", testImage); 

Проблема заключается в том, когда я смотрю на testImage, все пиксели немного смещены вправо от исходного изображения.

inputImage:
enter image description here

testImage:
enter image description here

Это гораздо проще, чтобы увидеть, если вы сохраните фотографии прочь, но вы заметите, что все в testImage смещена вправо приблизительно 5 пикселей или около того. Вы увидите белый зазор слева от черного содержимого в testImage

Где-то в моих 5 строках кода я каким-то образом перемещаю свое изображение. Кто-нибудь знает, как это может произойти? В настоящее время я подозреваю, что TIFFRepresentation

ответ

2

Поставщик данных, который вы передаете CGImageMaskCreate(), должен быть необработанным пикселем в форме, заданной другими параметрами, а не форматом файла изображения. Вы не должны передавать данные TIFF. Честно говоря, я удивлен, что у вас есть что-то отдаленно напоминающее исходное изображение, а не шум/мусор. Я предполагаю, что данные TIFF не были сжаты, по чистой случайности. На самом деле вы можете увидеть немного шума, который является заголовком TIFF, интерпретируемым как пиксели, в верхнем левом углу вашей маски.

Вероятно, лучше всего, чтобы создать CGImage от вашего inputImage (или, в зависимости от того, как inputImage была создана, пропустите NSImage и создать CGImage непосредственно из файла с помощью CGImageSource API или CGImageCreateWith{JPEG,PNG}DataProvider()). Чтобы получить CGImage от NSImage, используйте -CGImageForProposedRect:context:hints:.

Затем получить поставщика данных из этого CGImage и создать маску CGImage от этого, используя различные свойства (ширина, высота, БПП и т.д.) запрошенные от первого CGImage, используя различные CGImageGet... функции.

+0

Совершенно спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^