Получить данные пикселей из UIImage в неподдерживаемом формате? - PullRequest
1 голос
/ 08 мая 2011

В качестве особого случая этот вопрос :

Что вы делаете, если формат вашего UIImage не поддерживается?В моем случае у меня есть монохромный объект UIImage, который я читаю из файла.Каждый пиксель имеет 8 бит цветных (белых) данных, за которыми следуют 8 бит альфа-данных.Формат не поддерживается, но изображение отлично отображается на экране iPhone.

Но получение данных пикселей, как описано в указанном вопросе, не будет работать, поскольку формат не поддерживается.Так что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2015

Вы должны выполнить рендеринг в известный / поддерживаемый формат пикселей. Просто установите цель рендеринга растрового изображения в градациях серого или 24BPP, а затем нарисуйте изображение в пиксельном буфере с соотношением сторон 1: 1, чтобы не было изменения размера. Затем проверьте результаты известного формата в виде байтов или пикселей размером с слово. Вам нужно только позаботиться о цветовом пространстве sRGB на iOS, чтобы все было просто, и вы можете просто считывать значения пикселей непосредственно из пиксельного буфера.

0 голосов
/ 08 мая 2011

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

   CGImageRef cgImage = [image CGImage];
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef bitmapContext = CGBitmapContextCreate(NULL, CGImageGetWidth(cgImage), CGImageGetHeight(cgImage), 8, CGImageGetWidth(cgImage)*2, colorSpace, kCGImageAlphaLast);
    CGColorSpaceRelease(colorSpace);
    CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), cgImage);

    UInt8 *data = CGBitmapContextGetData(bitmapContext);
    int numComponents = 2;
    int bytesInContext = CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);

    int white;
    int alpha;


    for (int i=0; i < bytesInContext; i+= numComponents) {

        white = data[i];
        alpha = data[i+1];
    }
...