Квантовать изображение, сохранить список оставшихся цветов - PullRequest
2 голосов
/ 19 сентября 2011

Есть ли библиотека, которую я могу использовать, которая позволит мне квантовать изображения на iPhone?

Я хочу квантовать изображения до 8 цветов и записывать либо шестнадцатеричные, либо rgb-значения для каждого цвета, оставшегося после квантования.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2012

Вы можете использовать ImageMagick для этой задачи: https://github.com/marforic/imagemagick_lib_iphone MagickQuantizeImage и связанная с ним функция помогут вам.

0 голосов
/ 19 сентября 2011

Не должно быть слишком сложно сделать это самостоятельно. Доберитесь до пиксельных данных, а затем просто переберите и квантовайте. Вот как можно получить данные пикселей:

(Я полагаю, этот код взят из образцов поваренной книги Эрики Садун)

// Courtesy of Apple, Create Bitmap with Alpha/RGB values
CGContextRef CreateARGBBitmapContext (CGImageRef inImage, CGSize size)
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

    size_t pixelsWide = size.width;
    size_t pixelsHigh = size.height;
    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
    colorSpace = CGColorSpaceCreateDeviceRGB();

    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        return NULL;
    }

    // allocate the bitmap & create context
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL)
    {
        fprintf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }

    context = CGBitmapContextCreate (bitmapData, pixelsWide, pixelsHigh, 8,
                                     bitmapBytesPerRow, colorSpace,
                                     kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
    }

    CGColorSpaceRelease( colorSpace );
    return context;
}

// Return a C-based bitmap of the image data inside an image
unsigned char *RequestImagePixelData(UIImage *inImage)
{
    CGImageRef img = [inImage CGImage];
    CGSize size = [inImage size];

    CGContextRef cgctx = CreateARGBBitmapContext(img, size);
    if (cgctx == NULL) return NULL;

    CGRect rect = {{0,0},{size.width, size.height}};
    CGContextDrawImage(cgctx, rect, img);
    unsigned char *data = CGBitmapContextGetData (cgctx);
    CGContextRelease(cgctx);

    return data;
}

RequestImagePixelData вернет массив, в котором каждый пиксель описывается как 8 бит альфа, 8 бит красного, 8 бит зеленого и 8 бит синего.

...