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

CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 28 sept. 2014 à 12:35 - Dernière réponse : CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention
- 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?

--
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_Le Pivert 5425 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 10 octobre 2018 Dernière intervention - 28 sept. 2014 à 17:34
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_Le Pivert
NHenry 14264 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 9 octobre 2018 Dernière intervention - 28 sept. 2014 à 15:25
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
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - Modifié par CGSI3 le 28/09/2014 à 19:45
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
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - Modifié par CGSI3 le 28/09/2014 à 20:32
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
cs_Le Pivert 5425 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 10 octobre 2018 Dernière intervention - 28 sept. 2014 à 20:49
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
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 28 sept. 2014 à 21:22
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.