IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.NET] Copier une partie d'une image BITMAP dans une autre


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut [VB.NET] Copier une partie d'une image BITMAP dans une autre
    Bonjour,

    Je cherche dans le cadre d'un éditeur de niveau pour un jeu à copier une BITMAP dans une autre BITMAP à une destination précise :
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim b as new Bitmap("chemin_image")
    Dim allImage as new Bitmap(320, 240)
     
    ' ajoute l'image b dans allimage à la position (0,10) en pixels
    mafonction(allImage, b, 0, 10)
    Voilà reste à coder la fonction "mafonction".

    Est ce possible ? Je me suis tourné vers Graphics avec la méthode DrawImage et Clone de la classe Bitmap mais je n'arrive pas

    Une idée ? Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    La méthode est pourtant la bonne.
    Enfin, j'aurais plutôt tendance à utilise System.Drawing.Image plutot que System.Drawing.Bitmap mais bon.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Bitmap bmp = new Bitmap("image.bmp");
    Bitmap buffer = new Bitmap(320, 340);
     
    using (Graphics g = Graphics.FromImage(buffer))
    {
        g.DrawImage(bmp, 0, 10);
    }

    Le code est en C#, mais bon, y'a pas grandes différences.

  3. #3
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Salut,

    Oui mais ca ne fonctionne pas. Les images dans la bitmap allZone se chevauche (cf pièce jointe).
    On dirait que la position x et y de ma fonction ne fonctionne pas... (Tu peux rajouter un décalage de 50px par exemple, il va juste décaler le coin haut gauche de l'image de 50 et pas entre chaque petit "tile" de 32px par 32px...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function test(ByVal source As Bitmap, ByVal part As Image, ByVal x As Integer, ByVal y As Integer) As Bitmap
     
            ' partB.Save("s_temp_" + x.ToString + "_" + y.ToString + ".bmp")
            Dim g As Graphics = Graphics.FromImage(source)
            g.DrawImage(part, x, y)
            g.Dispose()
     
            ' source.Save("temp_" + x.ToString + "_" + y.ToString + ".bmp")
     
            Return source
        End Function
    Et son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub exporterZone()
            Dim allZone As New Bitmap(NBCOLONNE * TY, NBLIGNE * TX)
            For i = 0 To NBCOLONNE - 1
                For j = 0 To NBLIGNE - 1
    'récupération de la picturebox correspondante en fct de son nom                
    Dim p As PictureBox = recupererControleParNom("zone_" + i.ToString + "_" + j.ToString)
                    If Not p Is Nothing Then
                        allZone = test(allZone, p.Image, i * 32, j * 32)
                    End If
                Next
            Next
     
            allZone.Save("final.bmp")
        End Sub
    Je travaille en pixels

    Je joins aussi l'image d'origine (tile_maison.png qui est répétée dans allZone).

    Pourquoi ce décalage dans le fichier final.bmp ?


    Merci
    Images attachées Images attachées   
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut COPIER IMAGE DANS AUTRE IMAGE
    Bonjour,
    cela parait simple mais il surgit un probleme à propos des tailles d'image source et cible.Lorsque la taille cible est plus petite que la taille source ,la taille source sera copie mais rogne,sans compter le probleme de format et de resolution qui doivent etre identique.
    voici le bout de code et j'ai fait la copie en conservant les tailles d'origine
    des 2 images (jpeg taille identique=800x800 pixel-prise du bureau windows à savoir nenuphar.jpg et hiver.jpg).
    en copiant l'image source au centre de la cible ,elle se trouve rogne tot simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Public Class Form1
        Dim copyBmp As Bitmap
        Dim cibleBmp As Bitmap
        Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Try
                ' charge  image cible
                cibleBmp = New Bitmap( _
                    "C:\Documents and Settings\Bureau\WinAppCopyImage\destimg.jpg", _
                    True)
     
                Dim xCibleSize As Integer = cibleBmp.Width
                Dim yCibleSize As Integer = cibleBmp.Height
                ' affiche cible dans PictureBox1 à la taille d'origine
                PictureBox1.ClientSize = New Size(xCibleSize, yCibleSize)
                PictureBox1.Image = cibleBmp
                ' affiche taille en pixel dans Label1.
                Label1.Text = "Taille : " & cibleBmp.Width.ToString & cibleBmp.Height.ToString
                'cree un objet graphique à partir de l'image cible
                Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
     
                ' charge  image source  à copier.
                copyBmp = New Bitmap( _
                    "C:\Documents and Settings\Bureau\WinAppCopyImage\copyimg.jpg", _
                    True)
     
                'taille image à copier
                Dim xCopySize As Integer = copyBmp.Width
                Dim yCopySize As Integer = copyBmp.Height
                g.DrawImage(copyBmp, CInt(xCibleSize / 2), CInt(yCibleSize / 2), xCopySize, yCopySize)
     
     
            Catch ex As ArgumentException
                MessageBox.Show("erreur " _
                    & "verifier chemin fichier image .")
            End Try
        End Sub
     
     
     
    End Class
    bon code................

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    peut être une piste à tester.
    Ce code (largement inspiré d'un code de Balena), dessine un certain nombre d'images, en les juxtaposant et modifiant l'échelle éventuellement, sur un formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
        '*** rapports d'échelle horiz. et verti.
        Dim coeffEchelX As Single = 1.2
        Dim coeffEchelY As Single = 0.8
     
        Sub JuxtaposeImage(ByVal gr As Graphics, ByVal bmp As Bitmap, ByVal x As Integer, ByVal y As Integer)
            ' Start with values of parallelogram's vertex.
            Dim x0 As Integer = x
            Dim y0 As Integer = y
            Dim x1 As Integer = CInt(x + bmp.Width * coeffEchelX)
            Dim y1 As Integer = y
            Dim x2 As Integer = x
            Dim y2 As Integer = CInt(y + bmp.Height * coeffEchelY)
     
            '*** Coordonnées d'au moins 3 angles de l'image.
            Dim points() As Point = {New Point(x0, y0), New Point(x1, y1), New Point(x2, y2)}
            '*** Dessine l'image
            gr.DrawImage(bmp, points)
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim gr As Graphics = Me.CreateGraphics
            Dim bmp As New Bitmap("tile_maison.png")
     
            '*** Nombres d'images à juxtaposer horiz. et verti.
            Dim nbreHoriz As Integer = 3
            Dim nbreVerti As Integer = 2
     
            For x As Integer = 1 To nbreHoriz
                For y As Integer = 1 To nbreVerti
                    JuxtaposeImage(gr, bmp, CInt(100 + (bmp.Width * coeffEchelX * x)), CInt(20 + (bmp.Height * coeffEchelY * y)))
                Next
            Next
            '' '' Create a destination rectangle 3 times as wide and twice as tall.
            ' ''Dim rect As New RectangleF(20, 120, CSng(bmp.Width / 3.5), CSng(bmp.Height / 3))
            '' '' Draw the enlarged bitmap.
            ' ''gr.DrawImage(bmp, rect)
     
            bmp.Dispose()
            gr.Dispose()
     
        End Sub

  6. #6
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Je ne suis pas sur de comprendre ton problème.

    Si j'ai bien compris tu veux extraire une petite partie de l'image "tile_maison" (cette image contient les différentes parties de "texture" qui peuvent être utilisées pour le rendu d'une maison) et coller uniquement cette partie sur la destination (allzone).
    En répétant cette partie autant qu'il le faut pour en remplir complètement l'image allzone.

    C'est ce que j'en conclut compte tenu de l'apparence de tile_maison et le fait que ta fonction dispose les éléments à 32px d'interval.
    Cependant je ne trouve pas de zone dans tile_maison qui fait 32x32 pixels.

    J'étais parti du principe que tu voulais copier l'intégralité de l'image source dans la destination. Mais ce n'est visiblement pas le cas.

    Du coup je remanie mon exemple (toujours en C#, dsl ^^') :
    Admettons que je veuille tapisser l'image destination avec la partie en bas à droite de l'image "tile_maison", ce qui ressemble à du pavé rose.

    Cette partie est un carré de 16x16 dont le coin supérieur gauche est à la position (96;80).

    Le code sera le suivant :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Image tile = Image.FromFile("tile_maison.png");
    Image dest = new Bitmap(320, 240);
     
    using (Graphics g = Graphics.FromImage(dest))
    {
        for (int i = 0; i < (320 / 16); i++)
        {
            for (int j = 0; j < (240 / 16); j++)
            {
                g.DrawImage(tile, new Rectangle(i * 16, j * 16, 16, 16), new Rectangle(96, 80, 16, 16), GraphicsUnit.Pixel);
            }
        }
    }

    Il existe une autre méthode plus simple quand il s'agit de remplir une grande zone avec une image répétée :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    using (Graphics g = Graphics.FromImage(dest))
    {
        using (TextureBrush tbr = new TextureBrush(tile, new Rectangle(96, 80, 16, 16)))
        {
            g.FillRectangle(tbr, 0, 0, 320, 240);
        }
    }

Discussions similaires

  1. Utilisation d'une image bitmap dans une DLL
    Par colorid dans le forum Débuter
    Réponses: 5
    Dernier message: 27/02/2009, 15h41
  2. copier une partie d'un fichier texte dans un autre
    Par Valarauko dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/10/2007, 21h17
  3. Réponses: 3
    Dernier message: 31/10/2006, 12h20
  4. [VBa-E] Object Ole "image bitmap" dans une Userform?
    Par gootsu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/07/2006, 14h24
  5. Réponses: 6
    Dernier message: 22/12/2004, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo