sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 2007
-
22 avril 2005 à 03:12
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 2007
-
22 avril 2005 à 12:20
Salut a tous, j'ai un truc plutot bizarre, je cherche a compresser des images a la voler sans passer par le disque-dur.
je fait ceci :
public Truc(Bitmap img) // ici je recoie une image de type BMP (qui fait 3.51 Mo)
{
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
new_image = new Bitmap(ms); // ici mon image PNG fait 4 Mo :S
ms.Close();
}
alors j'ai tenter une autre approche pour tester un truc, et la je tombe sur un truc encore plus bizzar :
public Truc(Bitmap img) // toujours mon image de type BMP (3.51 Mo)
{
img.Save("c:\\test.tmp", System.Drawing.Imaging.ImageFormat.Png);
new_image = new Bitmap("c:\\test.tmp");
MemoryStream ms = new MemoryStream();
new_image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] buffer = ms.GetBuffer();
int len = buffer.Length; // ici len fait 4 Mo :S
}
pour le deuxieme bout de code, ce que j'aimerais qu'on m'explique c'est pourquoi dans ce cas precis mon fichier c:\test.tmp a bien ete compresser a 2,51Mo ?
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 22 avril 2005 à 10:52
Ouais je sais mais, le champs de bit est le meme pour toutes images de meme taille en pixels quelque soit la compression :) je me suis mal exprimer, desoler :)
En fait je tentais de mettre quelque chose en evidence, quelque chose que je n'ai pas montrer, autant pour moi :)
MemoryStream ms =
new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Close();
return (ms.GetBuffer());
Ceci, quand je fait img.Save enregistre dans un fichier et compresse, le fait d'utiliser un stream permet de pouvoir ensuite travailler avec un espace memoire et evite de passer inutilement par le disque dur. En theorie, le MemoryStream est censer substituer un fichier du disque dur, donc le MemoryStream devrait contenir un buffer similaire a celui qui se trouve sur le disque dur, c'est a dire un buffer ou la donnee d'image est compresser.
Au return, le ms.GetBuffer().Length est toujours de 4 Mo, et ceci n'est pas normal... du moins pas a ma connaissance.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 22 avril 2005 à 11:07
en faisant ceci, ca fonctionne :
img.Save("c:\\temp.tmp", System.Drawing.Imaging.ImageFormat.Png);
StreamReader sr =
new StreamReader("c:\\temp.tmp");
BinaryReader br =
new BinaryReader(sr.BaseStream);
Mais ce n'est pas ce que je veux, si quelqu'un a un moyen de faire ceci sans passer par le disque et tout en gardant un buffer compresser, je suis preneur
Merci d'avance
Vous n’avez pas trouvé la réponse que vous recherchez ?
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 22 avril 2005 à 12:20
arf, je dis de la merde, le MemoryStream n'as strictement aucune idee de comment est faite l'image :S je comprend pas comment ca se fait ni qu'elle est la reelle difference entre GetBuffer et ToArray puisque je pensais qu'il faisait tout les deux une espece de
return (_internal_buffer);
ou un truc dans le style, amais bon ca fonctionne... c'est etrange et j'aimerais quand meme bien savoir ce qui se passe, si quelqu'un connait ?