Изменить размер изображения до x mb - PullRequest
1 голос
/ 03 марта 2010

Есть ли способ изменить размер изображения (взятого с камеры или UIImagePicker и сохраненного во временную папку) до 1 МБ?

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

большое спасибо

Ответы [ 4 ]

1 голос
/ 03 марта 2010

Я использовал этот код для изменения размера изображения, которое нашел здесь .

UIImage* resizedImage(UIImage *inImage, CGRect thumbRect)
{
    CGImageRef          imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    // There's a wierdness with kCGImageAlphaNone and CGBitmapContextCreate
    // see Supported Pixel Formats in the Quartz 2D Programming Guide
    // Creating a Bitmap Graphics Context section
    // only RGB 8 bit images with alpha of kCGImageAlphaNoneSkipFirst, kCGImageAlphaNoneSkipLast, kCGImageAlphaPremultipliedFirst,
    // and kCGImageAlphaPremultipliedLast, with a few other oddball image kinds are supported
    // The images on input here are likely to be png or jpeg files
    if (alphaInfo == kCGImageAlphaNone)
        alphaInfo = kCGImageAlphaNoneSkipLast;

    // Build a bitmap context that's the size of the thumbRect
    CGContextRef bitmap = CGBitmapContextCreate(
                NULL,
                thumbRect.size.width,       // width
                thumbRect.size.height,      // height
                CGImageGetBitsPerComponent(imageRef),   // really needs to always be 8
                4 * thumbRect.size.width,   // rowbytes
                CGImageGetColorSpace(imageRef),
                alphaInfo
        );

    // Draw into the context, this scales the image
    CGContextDrawImage(bitmap, thumbRect, imageRef);

    // Get an image from the context and a UIImage
    CGImageRef  ref = CGBitmapContextCreateImage(bitmap);
    UIImage*    result = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);   // ok if NULL
    CGImageRelease(ref);

    return result;
}
0 голосов
/ 03 марта 2010

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

ImageMagick * Инструменты командной строки могут ограничивать размер файла при использовании кодирования JPEG (с переключателем "-define jpeg:extent=1mb"), ухудшая качество изображения. Я просто взглянул на источник (coders/jpeg.c), и он в основном просто выполняет бинарный поиск , где в каждой итерации цикла он кодирует изображение, проверяет размер и продолжается соответственно до он находит параметр максимального качества (то есть уровня сжатия), который дает вам файл с указанным размером. Даже если вы хотите уменьшить размеры изображения вместо уровня сжатия, идея и алгоритм остаются теми же.

Вы можете сделать что-то подобное, используя API Apple, но если они не кажутся адекватными, ImageMagick может быть скомпилирован для работы на iPhone .

Обратите внимание, что выполнение таких операций с большими изображениями и на маломощных устройствах, таких как iPhone, будет очень интенсивным ЦП.

0 голосов
/ 03 марта 2010

Все зависит от формата вашего файла ... большинство фотографий сделано в формате JPEG, который является быстрым алгоритмом преобразования Фурье в серверной части. Эмпирическое правило заключается в том, что чем больше вариантов у вас есть изображение, тем меньше размер вам придется использовать для достижения этого порога в 1 МБ. Реальное решение - использовать библиотеку изображений, ImageMagick - самый простой или libjpeg, создать файл, проверить размер, а затем изменить размер при необходимости. На самом деле нет простого ответа, если вы ищете, чтобы он содержал менее 1 МБ, тогда как вам было бы намного проще указать качество. Но вот некоторые инструменты, которые могут вам помочь, если вы разрабатываете приложение:

для C ++: Magick ++ для библиотеки изображений, создайте файл и проверьте байт, в котором вы читаете ... это может помочь

для Java: используйте JMagick для библиотеки изображений (Java API для imagemagick), либо создайте bufferedbytearraystream (я думаю, это имя) и проверьте размер после записи в него jpeg, либо сделайте то же самое с файлом после создания временный файл.

0 голосов
/ 03 марта 2010

В Linux я бы использовал imagemagick для изменения размера картинки, но я полагаю, вы разрабатываете приложение на iPhone?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...