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

envisager une application traitant le téléchargement de fichiers PNG potentiellement très volumineux.

Tous les fichiers téléchargés doivent être stockées sur le disque pour une récupération ultérieure. Cependant, les fichiers PNG peuvent avoir une taille allant jusqu'à 30 Mo, mais les limites de stockage sur disque donnent une taille maximale par fichier de 1 Mo.

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

Cette opération sera évidemment avec perte et réduction de la qualité d'image, les couleurs, etc n'est pas un problème. Cependant, une chose qui ne doit pas être changée est la dimension de l'image. Ainsi, un fichier d'entrée de dimension 800x600 doit produire un fichier de sortie de dimension 800x600.

les exigences susmentionnées sont strictes et ne peuvent être modifiées.

en utilisant ImageMagick (ou un autre outil open source) comment feriez-vous pour réduire la taille du fichier D'entrée PNG-fichiers de taille ~30 MB à un maximum de 1 MB par fichier, sans changer les dimensions de l'image?

29
demandé sur Etienne Neveu 2010-02-13 14:34:44

12 réponses

PNG n'est pas un format d'image avec perte, donc vous aurez probablement besoin de convertir l'image dans un autre format-- très 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 qui était assez petite. Tout cela peut être fait sans changer la résolution de l'image.

évidemment, selon l'image, la perte de la qualité visuelle peut être importante. JPEG fait le meilleur pour les images de la "vraie vie", comme les photos des appareils photo. Il ne fait pas aussi bien pour les logos, les captures d'écran, ou d'autres images avec des transitions "pointues" de la lumière à l'obscurité. (PNG, d'un autre côté, a le comportement opposé-- c'est mieux pour les logos, etc.)

cependant, à 800x600, il sera probablement très facile d'obtenir un JPEG en dessous de 1MB. (Je serais très surpris de voir un fichier de 30 Mo à ces petites dimensions. En fait, même non compressé, l'image ne serait autour de 1.4 MO:

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

Donc, vous avez seulement besoin de un taux de compression de 1,4:1 pour ramener l'image à 1MB. Selon le type d'image, la compression PNG peut très bien fournir ce niveau de compression. Si ce n'est pas le cas, JPEG pourrait presque certainement-- les rapports de compression JPEG de l'ordre de 10:1 ne sont pas rares. Encore une fois, la qualité / taille de la sortie dépendra du type de l'image.

enfin, bien que je n'ai pas utilisé ImageMagick depuis un petit moment, je suis presque certain qu'il y a des options pour re-compresser une image en utilisant un facteur de qualité. Lisez les docs, et commencez à expérimenter!

EDIT: il semble que cela devrait, en effet, être assez facile avec ImageMagick. À partir de la docs:

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

il suffit de continuer à jouer avec la valeur de qualité jusqu'à ce que vous obtenez une sortie appropriée.

39
répondu Eric Pi 2010-02-13 12:01:27

votre exemple est gênant parce qu'une image de 30 Mo à une résolution de 800x600 stocke 500 bits par pixel. Clairement sauvagement irréaliste. Merci de nous donner des nombres réels.

en attendant, l'approche" pas chère et joyeuse " que j'essaierais serait la suivante: réduire l'image d'un facteur de 6, puis la redimensionner d'un facteur de 6, puis l'exécuter par compression PNG. Si vous avez de la chance, vous réduirez la taille de l'image d'un facteur de 36. Si vous obtenez malchanceux les économies être plus comme 6.

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

si ce n'est pas assez, vous pouvez lancer un 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 Qu'ImageMagick.)

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

Aussi, si vous êtes vraiment à jeter l'information de façon permanente, vous sont presque certainement mieux en utilisant la compression JPEG, qui est conçu pour perdre l'information raisonnablement gracieusement. Y a-t-il une raison pour que JPEG ne soit pas approprié pour votre demande?

7
répondu Norman Ramsey 2010-02-14 00:09:31

Depuis la taille d'un fichier image est directement liée à la taille de l'image et le nombre de couleurs, vous semblez avoir un seul choix: réduire le nombre de couleurs.

Et ~30 MO vers le bas à 1 mo est un très grande réduction.

Il serait difficile d'atteindre ce ratio avec une conversion en monochrome.

3
répondu pavium 2010-02-13 11:42:00

cela dépend beaucoup de ce que vous voulez à la fin, j'aime souvent réduire le nombre de couleurs tout en continuant la taille. Dans de nombreux cas, les couleurs réduites n'ont pas d'importance. Voici un exemple de réduction des couleurs à 254.

convert -colors 254 in.png out.png
3
répondu esse 2012-11-30 19:10:34
  • Étape 1: réduisez l'image à 1/16 de sa taille originale.
  • Étape 2: diminuez le nombre de couleurs.
  • Étape 3: augmentez la taille de l'image à sa taille originale.
1
répondu pieter 2012-05-04 14:12:50

vous pouvez essayer le pngquant utilitaire. Il est très simple à installer et à utiliser. Et il peut compresser votre PNGs beaucoup sans perte de qualité visible.

une fois que vous l'installez essayez quelque chose comme ceci:

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

pour mon image Démo (générée par imagemagick) la première commande réduit 350KB à 110KB, et la seconde la réduit à 65KB.

1
répondu Dmitry Sokurenko 2015-11-12 15:18:23

je sais que vous voulez conserver la taille des pixels, mais vous pouvez réduire la taille de pixel et de régler le DPI stockées avec l'image de sorte que la taille de l'écran est-elle 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, alors vous pouvez simplement définir la taille de pixel de l' <img> balise.

0
répondu Lou Franco 2010-02-15 15:23:11

cela dépend du type d'image, est-ce une image réelle ou une image générée par ordinateur, pour les images de la vie réelle png fera très peu, il pourrait même ne pas compresser du tout, utiliser jpg pour ces images, il l'image a un nombre limité de couleurs différentes (il peut avoir une profondeur d'image 24 bits, mais le nombre d'images uniques sera faible) png peut compresser très bien. png est fondamentalement une implémentation de zip pour les images donc si beaucoup de pixels sont les mêmes, vous pouvez avoir une compression assez agréable ratio, Si vous avez besoin de compression sans perte ne faites pas de redimensionnement.

0
répondu just a guest 2014-07-20 00:51:12

utiliser optipng réduire la taille sans perte

http://optipng.sourceforge.net/

0
répondu JulienGenoud 2015-09-14 23:22:14

si vous voulez modifier la taille de l'image dans ubuntu, vous pouvez essayer "gimp". J'ai essayé quelques applications d'édition d'image dans ubuntu et cela semble être le meilleur parmi eux.

COMMENT FAIRE POUR L'INSTALLER?

-Ouvrir le terminal

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

- donnez le mot de passe admin. vous avez besoin de la connexion à internet pour cela.

Exporter en tant que > cliquez sur "Exporter" bouton

- vous obtiendrez une petite fenêtre, où cochez la case "Show preview in image window". Une fois cette option cochée, vous pourrez voir la taille actuelle du fichier ainsi que le niveau de qualité.

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

-une fois le réglage terminé, cliquez sur le bouton "Exporter" pour enregistrer le fichier.

0
répondu InuYasha 2015-12-03 19:11:55

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

0
répondu Jerry T 2017-10-26 03:17:25

clic Droit sur l'image. Sélectionnez Ouvrir avec de la peinture. Cliquez sur redimensionner. Cliquez sur le pixel et changez l'horizontale à 250 ou 200.

C'est la seule chose. C'est le moyen le plus rapide pour ceux qui utilisent Windows XP ou Windows 7.

-7
répondu kajallysanneh 2017-09-24 08:21:16