Comment réduire la taille d'une image en C# et .NET 3.5?
J'ai une capture d'écran je prends dans mon application mobile. La capture d'écran prend environ 32 KO lors de l'enregistrement au format png sur un disque.
Je suis l'envoi à un centre de SQL Server et 32 KO est trop grand pour le nombre de fois où j'ai besoin de stocker cette capture d'écran (environ 2500 fois par jour).
Est-il une sorte de tromperie que je peux faire pour le faire pour sauver les petits?
Ici c'est le code que j'utilise maintenant à prendre à partir de Bitmap
d'octets (à envoyer au serveur pour le stockage):
MemoryStream stream = new MemoryStream();
_signatureImage.Save(stream, ImageFormat.Png);
return stream.ToArray();
_signatureImage
est un Bitmap
et est la capture d'écran en question.
Voici un exemple de la capture d'écran que je sauve:
Choses qui sautent à l'esprit (mais je ne sais pas comment les faire):
- Réduire la Hauteur et la Largeur de l'image (mais j'espère que d'une manière qui ne sera pas le déformer).
- Changer en une image en noir et blanc (je ne sais pas si je vais le voir tout l'espace réel de l'épargne à partir de ce)
- Compresser plus (je n'aime pas ce que beaucoup parce que c'est pas lisible à partir de la base de données).
Note, tout cela doit être fait par programmation, et ne peut pas prendre très longtemps, de sorte que l'image complexe de manipulations sont.
Merci pour toute aide.
Il est de 480 x 640.
OriginalL'auteur Vaccano | 2010-10-07
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner avec votre objet Bitmap de Type et de redimensionner la Hauteur ou la Largeur, selon ce qui est approprié pour votre les dimensions de l'image. Il permet également de maintenir l'échelle.
EDIT:
Vous pouvez créer un nouvel objet Bitmap et redimensionner votre image d'origine dans cet objet Bitmap.
Je n'ai pas le Compact Framework est installé, mais il semble que cela devrait fonctionner pour vous.
Vous devriez éviter de GetThumbnailImage de toute façon - il est seulement approprié pour 40x40 ou des images plus petites.
OriginalL'auteur pattertj
Si la profondeur de couleur n'est pas un problème, vous pouvez la changer en noir et blanc, ou 16 couleurs mode. Il devrait y avoir une économie significative sur le png 24 bits (ou 32 bits avec canal alpha) les conditions de stockage. L'autre chose à penser est de la sauvegarde .fichier gif en 256 couleurs mode.
Que vous êtes en train d'enregistrer les données de signature, je pense changer les dimensions de l'image serait une mauvaise idée. Vous pouvez également envisager l'application d'une compression sans perte comme le zip, mais c'est probablement plus gourmand en ressources que vous avez besoin.
Pas personnellement, mais une rapide recherche s'est jusqu'à ce lien: microsoft.com/downloads/en/... Sélectionnée cite: "Dans le .NET Compact Framework, il n'existe pas de méthode simple pour l'enregistrement des objets Bitmap ou d'obtenir une image bitmap gérer à partir d'une image de l'objet de sorte qu'il est nécessaire d'utiliser un peu de ruse pour accéder à une image bitmap données de pixel."
Mon entreprise est produit, DotImage Photo, peut le faire et il est un SDK gratuit. Appelez simplement GetChangedPixelFormat() sur un AtalaImage -- pass dans un indexée format, puis enregistrez avec AtalaImage.Save(). atalasoft.com/photofree
Désolé, juste remarqué que vous avez besoin de CE -- ne fonctionne pas.
OriginalL'auteur arootbeer
Changer la palette de couleurs d'une profondeur de couleur inférieure. Jetez un oeil à cette question (bien regarder le answert vraiment) qui montre la conversion de 1bpp. Vous pouvez aller à 8bpp au lieu de 1bpp et ont une grande taille d'épargne. Le mécanisme de conversion sont les mêmes que ce qui est montré.
MODIFIER
Penser hors de la boîte, vous pourriez aussi envisager d'envoyer simplement les points de données à partir de la partie supérieure de l'écran et la signature du vecteur, et le serveur de recréer l'écran pour vous. Si la taille est vraiment un gros problème, je serais probablement étudier cela.
EDIT 2
Si le simple fait de redimensionnement de l'image est une solution raisonnable (vous aurez évidemment de perdre des données en faisant cela), alors vous pouvez utiliser l'Imagerie de l'espace de noms dans la SDF pour créer une vignette comme Alex explique ici.
OriginalL'auteur ctacke
Si monochrome de l'image est acceptable, vous pouvez essayer TIFF G4 (compression sans perte). TIFF G4 est connu pour être très efficace dans la taille des fichiers à stocker des images en noir et blanc. Malheureusement je n'ai pas toutes les informations disponibles sur la façon dont il se compare à PNG, mais qui mérite d'être examiné en lui.
Ici est de l'info et de l'exemple sur la façon de le faire en C#
OriginalL'auteur Fadrian Sudaman
Essayer de le convertir à un pur bitmap monochrome. Ceux-ci sont extrêmement petits, car ils n'utilisent que d'un bit par pixel.
EDIT: je suis un menteur. Juste essayé ce dans la Peinture et c'est à propos de 40k par rapport à l'original 20k. J'aurais juré que ceux dont l'énorme gain de place quand je les ai utilisés avant...
EDIT EDIT: OK, apparemment, ils n'ont d'énormes économies. C'est juste que pour ces images, PNG est encore plus massive de l'épargne. Juste essayé un 16-couleur de l'image au lieu et qui a soufflé jusqu'à 150k.
EDIT EDIT EDIT: MAIS, le bitmap monochrome zips à 9k octets, alors que le PNG séjours à 20k même zippés.
Donc il semble que si vous voulez aller à la compression de la route, vous pouvez d'abord convertir bitmap monochrome, puis compression pour les images autour de la moitié de la taille de la PNG.
Vous pouvez également enlever de l'information de l'image. Par exemple, sur l'écran, la seule chose qui a vraiment besoin de rester une image est la signature. Les barres au-dessus et au-dessous qui pourraient être arraché, et l'information numérique peut être envoyé en tant que tel et stockés séparément.
OriginalL'auteur jdmichal
De tir de feux d'Artifice avec une photo, qui ne sera pas le même, mais devrait donner une idée
Noter que de nombreux fichiers image sera plus petite avec une capture d'écran car il y a de grandes des groupements contigus de la même couleur, et c'est peut-être particulièrement vrai avec le noir et le blanc. Il sera probablement aussi dépend de l'algorithme utilisé pour convertir l'image, mais vous pouvez simplement aller avec ce que vous pouvez trouver...
OriginalL'auteur Kendrick
FWIW stockage de l'image physiquement à l'intérieur de SQL server n'est pas une solution optimale. Si vous utilisez Sql Server 2008, vous devriez regarder le flux de fichier de soutien qui vous permettra de stocker les images physiques sur le disque et d'y accéder comme s'ils étaient internes à SQL Server. Ce serait le plus susceptible d'alléger votre besoin de vous soucier de la taille des fichiers.
OriginalL'auteur Chris Marisic