Modifier la résolution d'un bitmap sans toucher aux pixels

Résolu
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - Modifié par CGSI3 le 28/09/2014 à 12:49
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 28 sept. 2014 à 21:22
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?

--

6 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
28 sept. 2014 à 17:34
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?
1
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
28 sept. 2014 à 15:25
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.
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
Modifié par CGSI3 le 28/09/2014 à 19:45
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

--
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
Modifié par CGSI3 le 28/09/2014 à 20:32
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

--
0

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

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
28 sept. 2014 à 20:49
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
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
28 sept. 2014 à 21:22
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

--
0
Rejoignez-nous