web-dev-qa-db-fra.com

Réduire la taille de fichier d'une très grande image, sans changer les dimensions de l'image

Prenons une application qui gère le téléchargement de fichiers PNG potentiellement très volumineux. 

Tous les fichiers téléchargés doivent être stockés sur le disque pour une récupération ultérieure. Toutefois, la taille des fichiers PNG peut atteindre 30 Mo. Toutefois, les limites de stockage sur disque donnent une taille maximale de 1 Mo par fichier.

Le problème est de prendre un fichier PNG d'entrée d'une taille de fichier allant jusqu'à 30 Mo et de produire un fichier PNG de sortie d'une taille de fichier inférieure à 1 Mo.

Cette opération entraînera évidemment des pertes - et la réduction de la qualité de l’image, des couleurs, etc. n’est pas un problème. Cependant, une chose qui ne doit pas être changée est la dimension de l'image. Par conséquent, un fichier d'entrée de dimension 800x600 doit générer un fichier de sortie de dimension 800x600.

Les exigences décrites ci-dessus sont strictes et ne peuvent pas être modifiées.

En utilisant ImageMagick (ou un autre outil open source), comment feriez-vous pour réduire la taille des fichiers PNG d'entrée d'une taille d'environ 30 Mo à un maximum de 1 Mo par fichier, sans modifier les dimensions de l'image?

29
knorv

Le format PNG n’est pas un format d’image avec pertes, vous devrez donc probablement convertir l’image en un autre format, le plus probablement JPEG. JPEG a un facteur de "qualité" réglable - vous pouvez simplement continuer à réduire le facteur de qualité jusqu'à ce que vous obteniez une image suffisamment petite. Tout cela peut être fait sans changer la résolution de l'image.

Évidemment, selon l’image, la perte de qualité visuelle peut être importante. Le format JPEG convient mieux aux images "vraies choses", telles que les images provenant d'appareils photo. Cela ne convient pas aussi bien pour les logos, les captures d’écran ou d’autres images avec des transitions "nettes" du clair au foncé. (Le PNG, en revanche, a le comportement opposé - c'est mieux pour les logos, etc.)

Cependant, avec un format 800 x 600, il sera probablement très facile d'obtenir un fichier JPEG de moins de 1 Mo. (Je serais très surpris de voir un fichier de 30 Mo à ces dimensions réduites.) En fait, même non compressé, l'image ne serait que d'environ 1,4 Mo:

800 pixels * 600 pixels * 3 Bytes / color = 1,440,000 Bytes = 1.4MB

Par conséquent, vous n'avez besoin que d'un taux de compression de 1,4: 1 pour obtenir une image inférieure à 1 Mo. Selon le type d’image, la compression PNG peut très bien fournir ce niveau de compression. Dans le cas contraire, le format JPEG pourrait presque certainement ... Les taux de compression JPEG de l'ordre de 10: 1 ne sont pas rares. Là encore, la qualité/taille de la sortie dépendra du type d’image.

Enfin, bien que je n’ai pas utilisé ImageMagick depuis un moment, je suis presque certain qu’il existe des options pour recompresser une image en utilisant un facteur de qualité spécifique. Lisez les docs et commencez à expérimenter!

EDIT: Apparemment, cela devrait être assez facile avec ImageMagick. De la docs :

$magick> convert input.png -quality 75 output.jpg

Continuez simplement à jouer avec la valeur de qualité jusqu'à ce que vous obteniez une sortie appropriée.

40
Eric Pi

Votre exemple est gênant, car une image de 30 Mo à une résolution de 800x600 stocke 500 bits par pixel. Clairement follement irréaliste. S'il vous plaît donnez-nous de vrais chiffres.

En attendant, j'essaierais de choisir une approche "pas chère et gaie": réduisez l’image par un facteur 6, puis redimensionnez-la par un facteur 6, puis exécutez la compression PNG. Si vous avez de la chance, vous réduirez par 36 la taille de l'image. Si vous êtes malchanceux, les économies seront de l'ordre de 6.

pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png

Si cela ne vous suffit pas, vous pouvez jeter une ppmquant au milieu (sur la petite image) pour réduire le nombre de couleurs. (Les exemples sont netpbm / pbmplus , que j'ai toujours trouvé plus facile à comprendre que ImageMagick.)

Pour savoir si une telle solution est raisonnable, nous devons connaître le nombre exact de votre problème.

De plus, si vous voulez vraiment jeter les informations de manière permanente, il est certainement préférable d'utiliser la compression JPEG, conçue pour perdre les informations de manière raisonnable. Y a-t-il une raison pour laquelle JPEG n'est pas approprié pour votre application?

7
Norman Ramsey

Cela dépend beaucoup de ce que vous voulez à la fin. J'aime souvent réduire le nombre de couleurs tout en préservant la taille. Dans de nombreux cas, les couleurs réduites importent peu. Voici un exemple de réduction des couleurs à 254. 

convert -colors 254 in.png out.png
3
esse

Étant donné que la taille d'un fichier image est directement liée aux dimensions de l'image et au nombre de couleurs, il semble que vous n'ayez qu'un choix: réduire le nombre de couleurs.

Et ~ 30 Mo à 1 Mo est une très grande réduction.

Il serait difficile d’atteindre ce rapport avec une conversion en monochrome.

3
pavium

Vous pouvez essayer l'utilitaire pngquant . C'est très simple à installer et à utiliser. Et il peut compresser beaucoup vos PNG sans perte de qualité visible.

Une fois que vous l'avez installé, essayez quelque chose comme ceci:

pngquant yourfile.png
pngquant --quality=0-70 yourfile.png

Pour mon image de démonstration (générée par imagemagick), la première commande réduit de 350 Ko à 110 Ko et la seconde à 65 Ko.

2
Dmitry Sokurenko
  • Étape 1: Réduisez l’image à 1/16 de sa taille originale.
  • Étape 2: Diminuez la quantité de couleurs.
  • Étape 3: Augmentez la taille de l'image à sa taille d'origine. 
1
pieter

Je sais que vous souhaitez conserver la taille en pixels, mais pouvez-vous réduire la taille en pixels et ajuster le DPI stocké avec l'image afin que la taille d'affichage soit préservée? Cela dépend du client que vous utiliserez pour visualiser les images, mais la plupart devraient l'observer. Si vous utilisez les images sur le Web, vous pouvez simplement définir la taille en pixels de la balise <img>.

0
Lou Franco

Essayez ImageOptim https://imageoptim.com/mac c'est gratuit et open source

0
Jerry T

Si vous voulez modifier la taille de l'image dans Ubuntu, vous pouvez essayer "gimp" . J'ai essayé quelques applications de retouche d'image dans Ubuntu et cela semblait être le meilleur d'entre eux.

COMMENT INSTALLER?

- Terminal ouvert

-type: Sudo apt-get install gimp-plugin-registry

-donner un mot de passe administrateur. vous avez besoin d'une connexion Internet pour cela.

-Une fois installé, ouvrez l'image avec l'éditeur d'images GIMP. Puis allez à: Fichier> Exporter sous> Cliquez sur le bouton 'Exporter' 

-Vous obtiendrez une petite fenêtre, où la case à cocher sur "Afficher l'aperçu dans la fenêtre de l'image". Une fois cette option cochée, vous pourrez voir la taille actuelle du fichier ainsi que le niveau de qualité.

-Ajustez le niveau de qualité pour augmenter/diminuer la taille du fichier.

-Une fois l'ajustement terminé, cliquez sur le bouton 'Exporter' pour enregistrer le fichier.

0
InuYasha

utilisez optipng il réduit la taille sans perte

http://optipng.sourceforge.net/

0
JulienGenoud

Cela dépend du type d’image, s’il s’agit d’une image réelle ou générée par ordinateur. Le nombre de couleurs différentes est limité (il peut avoir une profondeur d’image de 24 bits, mais le nombre d’images uniques sera faible). png peut se compresser assez facilement. De même, vous pouvez avoir un taux de compression plutôt agréable, si vous avez besoin d’une compression sans perte, ne faites pas de redimensionnement.

0
just a guest