2013-08-10 3 views
3

У меня есть анимированный gif-файл пользователя, который составляет около 10 Мб. Я бы хотел, чтобы пользователи загружали его и позволяли мне размещать его на моем сервере, но я бы хотел его перемасштабировать, чтобы он соответствовал максимальному размеру файла 5 МБ, чтобы сохранить пропускную способность от hotlinking.Алгоритм или математика для определения размера файла GIF?

У меня есть базовый метод прямо сейчас, который определяет targetWidth и targetHeight на основе площади поверхности пикселя.

Он работает достаточно хорошо:

CGFloat aspectRatio = originalHeight/originalWidth; 
    CGFloat reductionFactor = desiredFileSize/originalFileSize; 
    CGFloat targetSurfaceArea = originalSurfaceArea * reductionFactor; 

    int targetHeight = targetSurfaceArea/sqrt(targetSurfaceArea/aspectRatio); 
    int targetWidth = targetSurfaceArea/targetHeight; 

его довольно точно, напр. результаты: файл размером 27 МБ превратится в 3.3mb, или 13.9mb превратится в 5.5mb.

Я хотел бы настроить эту точность, чтобы приблизиться к 5 МБ, и я надеялся, что кто-то узнает немного больше о том, как gif цвет/количество кадров может быть лучше учтено в этом алгоритме. Спасибо

+0

вы хотите изменить размер вашего изображения? поэтому может быть уменьшен размер файла также>? – iPatel

+0

@iPatel да, я пытаюсь уменьшить размер файла, изменив размер изображения. Я хотел бы решить для 5mb = ширина и высота – user339946

ответ

0

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

Однако, если у вас есть много циклов вычисления, вы можете использовать подход на основе approximation. Используйте приведенный выше алгоритм, чтобы дать вам первый размер изображения. Если результирующий файл составляет> 5 Мб, половину процента изменения размера и повторите попытку. Если < 5Mb добавьте 50% к проценту изменения размера и повторите попытку. Повторяйте, пока вы не достигнете достаточно близкого расстояния до 5 Мб.

Так, например

50% = 3.3Mb, so try halfway between 50 and 100 
75% = 6.1Mb, so try halfway between 75 and 50 
62.5% = 4.7Mb so try halfway between 62.5 and 75 

и т.д.