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
67
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
59
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
59
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
59
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
67
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