Modifier la résolution d'un bitmap sans toucher aux pixels [Résolu]

Messages postés
417
Date d'inscription
vendredi 22 février 2008
Dernière intervention
7 janvier 2018
-
Bonjour a tous,

J'utilise Vb.Net 2013 (Framework 4),

Pour changer la taille d'un Bitmap j'utilise cette fonction

    ''' <summary>
    ''' Scales a bitmap to the specified width and height using high quality bicubic scaling.
    ''' </summary>
    ''' <param name="b">The original bitmap.</param>
    ''' <param name="width">The new width of the bitmap.</param>
    ''' <param name="height">The new height of the bitmap.</param>
    ''' <returns>The scaled bitmap.</returns>
    ''' <remarks></remarks>
    Public Shared Function Scale(ByVal b As Bitmap, ByVal width As Integer, ByVal height As Integer) As Bitmap
        If b Is Nothing Then Throw New ArgumentNullException
        If width <= 0 Or height <= 0 Then Throw New ArgumentException("The width and height must be greater than zero.")

        Dim sb As New Bitmap(width, height, b.PixelFormat)
        Dim gr As Graphics = Graphics.FromImage(sb)
        gr.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        gr.DrawImage(b, New Rectangle(0, 0, width, height))
        gr.Dispose()
        Return sb
    End Function


Mais problème, elle modifie le nombre de pixels sans baisser ou augmenter la résolution de l'image (pixels/cm)

J'ai bien essayer de modifier la résolution en passant par la fonction SetRésolution mais ca ne fonctionne pas


Dim B As Bitmap
...
B.SetResolution(43, 43)

Pour exemple je veux afficher une image 200 pix*200 pix (96 dpi) en 200 pix*200 pix (43 dpi) sans toucher au nombre de pixels ce qui aurait pour effet de zoomer l'image dans une picturebox pour une application permettant de dessiner. (comme paint).

(Une autre solution pourrais aussi se trouver sur le facteur zoom de l'affichage du picturebox mais peut on alors déplacer l'image dans le picturebox?)

Bref comment changer la résolution d'un bitmap sans toucher au nombre de ses pixels?

--
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
5593
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 décembre 2018
1
Merci
Bonjour CGS13,

Essaie ceci:

Public Class Form1
    ''' <summary>
    ''' Scales a bitmap to the specified width and height using high quality bicubic scaling.
    ''' </summary>
    ''' <param name="b">The original bitmap.</param>
    ''' <param name="width">The new width of the bitmap.</param>
    ''' <param name="height">The new height of the bitmap.</param>
    ''' <returns>The scaled bitmap.</returns>
    ''' <remarks></remarks>
    Public Shared Function Scales(ByVal b As Bitmap, ByVal width As Integer, ByVal height As Integer, ByVal resol As Integer) As Bitmap
        If b Is Nothing Then Throw New ArgumentNullException
        If width <= 0 Or height <= 0 Then Throw New ArgumentException("The width and height must be greater than zero.")

        Dim sb As New Bitmap(width, height, b.PixelFormat)
        Dim gr As Graphics = Graphics.FromImage(sb)
        gr.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        gr.DrawImage(b, New Rectangle(0, 0, width, height))
        sb.SetResolution(CInt(resol), CInt(resol)) 'resolution 
        gr.Dispose()
        Return sb
    End Function
   Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim b As New Bitmap("chemin fichier.jpg")
        b = Scales(b, 100, 50, 72)
        b.Save("chemin fichier_copie.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    End Sub
End Class


Redimensionner en pixel en choisissant la résolution ppp

Si c'est cela que tu veux?

Merci cs_Le Pivert 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Le Pivert
Messages postés
14316
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
5 décembre 2018
0
Merci
Bonjour,

Tu veux faire quoi exactement ?
Car changer la résolution pour une Picturebox n'est pas pareil que pour une imprimante.

Pour changer la résolution (pixels/cm) (donc imprimante), un simple accès direct au fichier BMP en mode binaire et changer le champ concerné peut être assez rapide.
Par contre zoomer sur une partie de l'image pour un contrôle, est autre chose et ne sera pas impacté par le paramètre précédent.
Commenter la réponse de NHenry
Messages postés
417
Date d'inscription
vendredi 22 février 2008
Dernière intervention
7 janvier 2018
0
Merci
Bonsoir ami Pivert,
et Merci pour la fonction

En effet c'est la résolution ppp que je veux modifier a l'opposé de la taille de l'image. (et non dpi réservé a l'impression, )
Plus je l'agrandi en taille et plus je veux voir sa résolution diminuer.

Elle marche en effet. (elle s'agrandi)
Cependant j'ai bien fais quelques essais ensuite en sauvegardant l'images au fur et a mesure qu'elle s'agrandi sur mon écran, et je m'aperçois que la résolution ppp n'est pas modifié et garde la même résolution ppp qu'au départ.
( La taille du fichier augmente alors de manière importante )

Avez vous le même résultat ?

Une discussion sur le web semble parler de ce pb
http://social.msdn.microsoft.com/Forums/vstudio/en-US/62368caa-05f4-4798-9c59-5d82f881a97c/systemdrawingbitmapsetresolution-is-completely-broken-on-windows-7?forum=netfxbcl

Cordialement
CGSI3

--
Commenter la réponse de CGSI3
Messages postés
417
Date d'inscription
vendredi 22 février 2008
Dernière intervention
7 janvier 2018
0
Merci
Re,
Dslé

En effet la fonction marche parfaitement,
Il faut tout de suite sauvegarder l'image modifié sans aucun intermédiaire.

J'ai voulu initialiser tout de suite le Picturebox.Image et ensuite le sauvegarder ce qui a modifier la résolution du bitmap.

Je vous soumet une hypothèse : il semble donc qu'un PictureBox ne fonctionne qu'avec une résolution fixe de 96 ppp

Encore merci Ami Pivert

--
Commenter la réponse de CGSI3
Messages postés
5593
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
C'est normal, en cas de manipulation d'image, l'image s'enregistre automatiquement en 96 ppp. C'est pourquoi il faut renseigner le SetResolution de la résolution de sortie.

Dans mon dernier programme:

"Traitement d'image par lot"
http://codes-sources.commentcamarche.net/source/100732-traitement-d-images-par-lot

J'ai fait très attention à ce phénomène en renseignant le résolution de sortie identique à celle d'entrée

Bonne programmation
Commenter la réponse de cs_Le Pivert
Messages postés
417
Date d'inscription
vendredi 22 février 2008
Dernière intervention
7 janvier 2018
0
Merci
Re

En effet .. très judicieux
Cela va beaucoup me servir
Merci

Pour conclure ce que je voulais faire, je pense avoir trouvé une solution plus adapté

Régler le mode
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

Puis modifier l'échelle de cette façon
Picturebox1.Scale(New SizeF(Zoom, Zoom))

Zoom a 2 pour agrandir
zoom a 0.5 pour rétrécir
Attention les scales se cumulent

Cela ne modifie pas la taille du bitmap et permet une fluidité de l'appli.

Il ne me reste qu'a régler la translation de l'image lors des modifications.

Merci encore Ami pivert

Bonne soirée CGSI3

--
Commenter la réponse de CGSI3

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.