Diminuer la resolution d'une image (dpi)

Résolu
Syphou Messages postés 52 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 6 juin 2011 - 10 mai 2007 à 17:52
Syphou Messages postés 52 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 6 juin 2011 - 11 mai 2007 à 09:24
Bonjour;
Jai une fonction qui va chercher 28 000 images d'articles sur le net. Je doit les enregistrer sur un serveur, elles doivent etre carrée et etre < a 20ko

Donc je dois pour chaque image les redimensionner. Vu quelles doivent etre carrée, je prend la plus grande des deux taille (longeur ou largeur) et j'adapte lautre. Jai ainsi mon objet bitmap dans lequel je dessine limage dorigine.

 La fonction ci dessou fonction tes bien, elle redismensionne limage proportionelement, la met au centre de mon bitmap carré et enregistre.
MAIS la taille (en octet) est trop grande. Jai vu qu'on pouvai faire mon_bitmap.SetResolution(72, 72)
mais sa décale toute mon image et la taille nest pas plus petite :(
Jai mis toutes les options de mon objet graphique au minimum (low, none, ...) mais cest encore trop lourd.
Pour des images de 200X200 j'atteint les 50ko, beaucoup trop !!!
Quelqu'un sait ?, cest des images d'article, la qualite ne doit pas etre top

(remarque : je fait deux foi la meme chose ci dessou pour etre sur que mon image est bien carrée et quelle rentre dans le carré imposé)

bm cest mon bitmap qui contient mon image d'origine

'L'image doit être carrée, donc si L > H, image = L * L sinon H * H

If bm.Height > bm.Width
Thenresized =

New Bitmap(bm.Height, bm.Height)

Else

If bm.Height < bm.Width
Thenresized =

New Bitmap(bm.Width, bm.Width)

Elseresized =

New Bitmap(bm.Width, bm.Height)

End
If

End
If

'trouver la plus grande des deux dimensions de limage dorigine

Dim HauteurOrigine
As
Integer = bm.Height

Dim LargeurOrigine
As
Integer = bm.Width

Dim HauteurNew
As
Integer

Dim LargeurNew
As
Integer

Dim HauteurImposee
As
Integer = resized.Height

Dim LargeurImposee
As
Integer = resized.Width

Dim bitmapTMP
As Bitmap

Dim bitmapTMP2
As Bitmap

'Redimensionne dans un sens (simple regle de 3)

If LargeurOrigine > HauteurOrigine
ThenLargeurNew = LargeurImposee

HauteurNew = (HauteurOrigine / LargeurOrigine) * LargeurImposee

bitmapTMP =

New Bitmap(
CType(LargeurNew,
Integer),
CType(HauteurNew,
Integer))

Else

If LargeurOrigine < HauteurOrigine
ThenHauteurNew = HauteurImposee

LargeurNew = (LargeurOrigine / HauteurOrigine) * HauteurImposee

bitmapTMP =

New Bitmap(
CType(LargeurNew,
Integer),
CType(HauteurNew,
Integer))

End
If

End
If

'Redimensionne limage proportionnellementgraph = Graphics.FromImage(bitmapTMP)

'construit un objet graphic sur mon nouveau bitmapgraph.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy

graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed

graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None

graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low

graph.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None

graph.DrawImage(bm,

New System.Drawing.Rectangle(0, 0, bitmapTMP.Width, bitmapTMP.Height), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel)graph.Dispose()

'Redimensionne dans lautre sens pour etre sur que sa rentre dans le carre, ainsi ma plus grande des deux taille sera la largeur(ou hauteur, cest pareil) du carré imposéLargeurOrigine = bitmapTMP.Width

HauteurOrigine = bitmapTMP.Height

If LargeurOrigine > HauteurOrigine
ThenLargeurNew = LargeurImposee

HauteurNew = (HauteurOrigine / LargeurOrigine) * LargeurImposee

bitmapTMP2 =

New Bitmap(
CType(LargeurNew,
Integer),
CType(HauteurNew,
Integer))

Else

If LargeurOrigine < HauteurOrigine
ThenHauteurNew = HauteurImposee

LargeurNew = (LargeurOrigine / HauteurOrigine) * HauteurImposee

bitmapTMP2 =

New Bitmap(
CType(LargeurNew,
Integer),
CType(HauteurNew,
Integer))

End
If

End
If

'Redimensionne limage proportionnellementgraph = Graphics.FromImage(bitmapTMP2)

'construit un objet graphic sur mon nouveau bitmapgraph.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy

graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed

graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None

graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low

graph.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None

graph.DrawImage(bitmapTMP,

New System.Drawing.Rectangle(0, 0, bitmapTMP2.Width, bitmapTMP2.Height), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel)graph.Dispose()

 

'Maintenant qu'on a l'image redimensionnée proportionellement, il faut la "coller" dans le bitmap avec les tailles imposées

'je la place au centre du bitmap et avant tout je color le bitmap de la couleur du siteg = Graphics.FromImage(resized)

'construit un objet graphic sur mon nouveau bitmapg.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy

g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None

'color le bitmap en blanc, limage sera collée au centreg.Clear(ColorTranslator.FromHtml("#FFFFFF"))

g.DrawImage(bitmapTMP2,

CInt((resized.Width - bitmapTMP.Width) / 2),
CInt((resized.Height - bitmapTMP.Height) / 2))
g.Dispose()

resized.Save(URLSauvegarde)

Voila, quelqu'un a une idée pour gagné de la place?
Merci

(ps je suis sous visual 2003 en vb net)

2 réponses

Syphou Messages postés 52 Date d'inscription jeudi 27 avril 2006 Statut Membre Dernière intervention 6 juin 2011
11 mai 2007 à 09:24
Ton idee ma fait penser que j'ai vu sur le net que dans le bitmap.save("nom_image.jpg") on sait mettre le format de l'image : birmap.save("nom_image.jpg",System.Drawing.Imaging.ImageFormat.Jpeg)
et cela fonctionne ! mes images font entre 3 et 7ko

Donc en fait le fait de faire bitmap.save("mon_image.jpg") ne suffit pas aparrement cest une image bmp avec l'extension jpg. Donc il faut bien stipuler le format au moment de la sauvegarde.

Voila. Merci ;-)
3
IslandMan974 Messages postés 104 Date d'inscription mercredi 4 mai 2005 Statut Membre Dernière intervention 27 juin 2007 3
10 mai 2007 à 23:07
si je dit pas de betises ,la taille en KB des images dependent de leur format .Ainsi une meme image en .bmp,  .gif ,et .jpeg n' aura pas le  meme taille .Essaye de voir qu'elle extension est la mieux mais je crois que c gif

Bon courage
0
Rejoignez-nous