2010-11-01 16 views
1

Google App Engine se met en colère à propos des fichiers image sur 1M. Étant donné une image arbitrairement fournie par l'utilisateur, et la capacité d'exécuter du code C pour le pré-traiter, y a-t-il une manière intelligente de descendre à 1M avec une qualité maximale?Existe-t-il un moyen intelligent de compresser les images à une taille de fichier maximale au lieu d'un niveau de qualité?

La méthode de la force brute consiste à rechercher le niveau de compression et la résolution qui donnent un fichier 1M < en essayant une série de paramètres de qualité JPEG et une série de facteurs d'échelle.

Outre la recherche par force brute, toutes les idées d'une manière intelligente pour choisir la meilleure qualité JPEG et facteur d'échelle pour atteindre la taille de fichier 1M?

Quelle pourrait être une bonne heuristique, peut-être des hypothèses sur le pourcentage de compression atteint à divers niveaux de qualité JPEG?

La force brutale a la vertu de la simplicité et probablement elle sera assez rapide de toute façon, mais juste curieuse.

+0

Pour clarifier, en essayant de demander ici l'intelligence JPEG spécifique, plutôt que des techniques de recherche génériques telles que la recherche binaire. Ceux-ci sont encore "brutaux" dans le sens que je voulais dire. –

Répondre

3

la recherche binaire standard suppose des données aléatoires, ce qui est certainement pas le cas ici. Une approche plus efficace consiste à faire une interpolation linéaire. Cette fonction Taille de l'image compressée (Taille de l'image non compressée), comme toute fonction sensible, est linéaire si l'intervalle est suffisamment petit. Donc, à chaque interation, supposons une réponse linéaire. Cela arrivera avec la réponse DRAMATICALLY plus rapide que la recherche binaire. PAR EXEMPLE. compressé à 50% de qualité, .75 M, donc utilisez (1/.75) * 50% ~ 62%. Disons que les résultats dans une image de 1,5 M Maintenant, nous avons deux points. (X = 50%, Y = 0,75 M) et (X = 62%, Y = 1,5 M). La pente est (1.5-.75)/(62-50) = 75/12 Donc notre deuxième estimation serait .25M X (12/.75) = 4%, 50% + 4% = 54% Prendre les suppositions les plus proches jusqu'à présent, et répétez le processus jusqu'à ce que le résultat vous rende heureux. Vous pouvez utiliser une interpolation d'ordre supérieur, telle que la méthode Newtons, qui convergerait probablement encore plus rapidement.

3

Simple alghorythm - créer jpeg avec 100 qualité, si elle est inférieure à 1 M, de l'utiliser, si plus, créez 50, si maintenant moins de 1 M, que d'essayer 75, sinon essayer 25 ...

+0

à droite, j'inclus la recherche binaire sous la recherche brute force, je suppose –

+0

Ceci est appelé l'algorithme de recherche binaire. http://en.wikipedia.org/wiki/Binary_search_algorithm – Malfist

1

Cet article de Jeff Atwood lui-même semble impliquer qu'il existe un moyen de "standardiser un facteur de compression JPEG de 15": A Comparison of JPEG Compression Levels and Recompression (je n'ai pas complètement lu l'article, donc j'aurais pu mal comprendre le message quand je l'ai regardé).

Si vous pouvez définir le facteur de compression, vous pouvez définir la taille souhaitée.

Le tableau sur le Wikipedia article semble intéressant. Qualtiy = 50 -> Facteur de compression = 15: 1 (prouvé par mesure empirique sur wikipedia :-) ... Je tergiverse, je devrais faire autre chose en ce moment ...)

+0

C'est une bonne approche pour obtenir le niveau de compression de départ approximatif et ensuite vous pouvez continuer à utiliser l'algorithme de recherche binaire mentionné dans les autres réponses d'ici. Choisissez également les dimensions maximales appropriées. –

+4

Le facteur de compression donné à un moteur JPEG ne spécifie pas la taille résultante. Deux images commençant avec les mêmes dimensions peuvent être comprimées jusqu'à des tailles de fichier complètement différentes avec le même niveau de compression. La table dans Wikipedia est seulement valide pour cette image d'échantillon et aucuns autres. –

3

Cher team Google AppEngine:

Veuillez supprimer le bouchon de 1 Mo sur les fichiers image. Il existe déjà des quotas et des prix associés au stockage, au traitement, à la bande passante, etc. pour maintenir les incitations des développeurs à réduire la taille des fichiers.

Merci pour tout.
Sincèrement,

La communauté des développeurs

+0

une solution idéale en effet ;-) –