2010-01-19 8 views
15

Je voudrais redimensionner une image à une taille de fichier spécifique. Par exemple, pas plus de 200 Ko. Quelle est la meilleure approche pour y parvenir avec C# .NET?Comment redimensionner une image à une taille de fichier spécifique?

Merci!

+0

Quel format? PNG? JPEG? –

+1

Définir "meilleur": La plus rapide, meilleure qualité visuelle, utilisation minimale de la mémoire, utilisation minimale du processeur? – RedFilter

+0

Format JPEG (est-ce vraiment différent avec d'autres formats?). "Meilleur" -> 1. meilleure qualité visuelle 2. le plus rapide –

Répondre

3

Si vous y pensez, vous ne connaîtrez pas la taille de fichier de l'image tant qu'elle n'a pas été redimensionnée. Vous devez donc effectuer une itération successive des tentatives et comparer les tailles de fichier par la suite ou vous pouvez modifier vos contraintes pour limiter les images à un ensemble particulier de dimensions de hauteur et de largeur.

+1

Après avoir vérifié plusieurs méthodes qui obtiennent des résultats insatisfaisants, j'ai décidé de contraindre la largeur et la hauteur :) –

1

Vous pouvez faire beaucoup avec la classe Drawing.Image afin de redimensionner une image.

Il existe de nombreuses questions sur la façon de procéder. Voici one.

En termes de taille, vous ne saurez pas quelle est la taille après l'opération de redimensionnement. La seule façon d'être certain est de redimensionner, vérifier le résultat et s'il est trop grand, essayez de redimensionner avec une qualité inférieure. Répétez jusqu'à ce que terminé.

Vous pouvez approximer la taille si vous connaissez les dimensions et la profondeur de couleur, comme décrit dans la réponse à la question this (identique?).

+0

Cela ressemble à une façon stupide de le faire, d'un point de vue CompSci. – MSalters

+0

@MSalters Comment voulez-vous prédire l'avenir, d'une manière CompSci, c'est? – Oded

+0

Pour commencer, il s'agit d'un algorithme d'approximation successif unilatéral (il n'y a pas de vérification pour une sortie trop faible/mauvaise qualité).Par conséquent, il est lent ou sujet à dépassement. Le deuxième problème est que si vous n'atteignez pas la cible lors de votre première tentative, vous devrez tout refaire. – MSalters

1

Si cela est une fonction très importante, tâtonnement fonctionne assez bien. Supposez simplement que si vous devez réduire l'entrée à N * 100%, vous le faites en redimensionnant les deux dimensions par sqrt(N) * 100%.

Si est important, vous devez mieux comprendre les technologies de compression d'image. Je vais supposer JPG. C'est un format d'image qui permet d'obtenir une compression avec perte en décomposant l'image en blocs de 8x8 pixels, en les transformant en DFT, en jetant de petits coefficients et en compressant le train de bits résultant.

Maintenant, il s'ensuit que vous pouvez jouer avec le niveau de qualité, le nombre de petits coefficients que vous jetez. Vous n'avez pas besoin de refaire le DFT (cher) pour cela. Donc, si le fichier se termine juste un peu trop grand, vous pouvez jeter quelques coefficients de plus et recompresser. Et si vous étiez légèrement agressif, remettez quelques coefficients et comprimez à nouveau. Tout cela est assez rapide.

-1

est comme une estimation approximative suivante:

size(KB) = (width * height * bitdepth)/(8 * 1024)

La taille du fichier est gonflé un peu plus en raison de déposer des informations (informations de compression, etc.).

+0

-1 Pour quel type de fichier s'applique-t-il? Comment êtes-vous venu à cette formule? –

Questions connexes