L'image redimensionnée est plus lourde que l'originale.

Résolu
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 - 22 juil. 2008 à 16:59
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 - 23 juil. 2008 à 10:50
Salut à vous,

J'essaie de redimmensionner une image, pour diviser ses dimensions par 2.

J'ai esssayé avec  ça :

Bitmap original = new Bitmap(originalPath);
Bitmap result = new Bitmap(original.Width/2,original.Height/2);
Graphics g = Graphics.FromImage(result);
g.DrawImage(original , 0, 0, original.Width/2 , original.Height /2);
result.Save(resultPath,ImageFormat.Png); //J'ai essayé aussi avec ImageFormat.Jpeg

Le problème, c'est que l'image initiale pèse 2.8Mo, et que la nouvelle, plus petite, pèse 11.8Mo !!
J'aurais plutôt voulu diminuer le poids...

Si vous aviez une piste, ce serait génial.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

6 réponses

cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
22 juil. 2008 à 21:32
Salut,

Plusieurs possibilités :
- Si l'image était en jpg et que tu l'enregistres en png, la taille finale a 99% de chances d'être plus importante... mais là, je ne t'apprend sûrement rien.
- La méthode Save prend aussi en paramètre des options d'encodage. C'est notamment utile pour le jpg où l'on peut régler la qualité d'enregistrement. Je crois qu'elle est fixée à 80% par défaut.
- Ton image originale était en 8 bits/16 bits ou je ne sais quoi et par défaut quand tu créés une bitmap, la profondeur des couleurs est de... 24 ou 32 bits (à vérifier dans la doc).

Je ne vois que ça...
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
23 juil. 2008 à 07:33
Merci à vous deux.

En fait, le problème venait bien de la qualité. Par défaut, elle n'est pas à 80%, mais à 100%.
Pour ceux que ça intéresse, voici un petit bout de code qui fonctionne :

Bitmap original = new Bitmap(originalPath);
Bitmap result = new Bitmap(original.Width / 2, original.Height / 2);
Graphics g = Graphics.FromImage(result);
g.DrawImage(original, 0, 0, original.Width / 2, original.Height / 2);



ImageCodecInfo[] infos = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpgInfo = null;
foreach (ImageCodecInfo info in infos)
{
    if (info.FormatID == ImageFormat.Jpeg.Guid)
    {
        jpgInfo = info;
        break;
    }
}
if (jpgInfo == null)
    throw new Exception("Cannot find JPEG image codec.");



System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.Quality;



EncoderParameters param = new EncoderParameters();
param.Param[0] = new EncoderParameter(encoder, 80L);



result.Save(resultPath, jpgInfo, param);





Par contre, un truc qui m'énerve un peu, c'est que la classe ImageFormat possède bien une méthode FindEncoder retournant un ImageCodecInfo, mais elle est internal .
C'est le pourquoi de la bloucle pour retrouver le bon ImageCodecInfo.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
23 juil. 2008 à 09:08
Je viens de voir dans la section community, sur la page de la méthode Save de la classe Image, qu'ils utilisent un code similaire au tient, donc probablement qu'on ne peut pas faire mieux.... pour l'instant.

http://msdn.microsoft.com/en-us/library/ms142148(VS.80).aspx

<hr />
-My Blog-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
22 juil. 2008 à 23:42
Moui, même avis que niky...
Tu peux spécifier le type dans le constructeur de ton image finale.
A noter qu'il existe également une méthode GetThumbnail sur la classe Bitmap...

<hr />
-My Blog-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
23 juil. 2008 à 09:05
Tu peux toujours essayer de l'atteindre avec Reflection mais ça sera pas forcément plus rapide...
Au contaire

<hr />
-My Blog-
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
23 juil. 2008 à 10:50
Ca ne m'étonne pas que ce soit similaire, ça ressemble fortement au code de la méthode de ImageFormat.
Vive Reflector...

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
Rejoignez-nous