SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 2010
-
22 juil. 2008 à 16:59
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDerniè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)
A voir également:
L'image redimensionnée est plus lourde que l'originale.
cs_niky
Messages postés168Date d'inscriptionjeudi 28 juin 2001StatutMembreDernière intervention18 octobre 20087 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).
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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.");
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)
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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...