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 :

utiliser lockbits pour copier une image


Sujet :

VB.NET

  1. #1
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut utiliser lockbits pour copier une image
    bonjour

    je dois copier un morceau d'image géante (4000 * 1000) sur des petites images
    avec drawimage les perfs sont pas top et j'ai lu qu'avec lockbits ca peut etre beaucoup plus rapide

    mais je n'arrive pas à le faire fonctionner
    quand j'accède à ma nouvelle image j'ai une erreur disant qu'il y a un problème sur la mémoire


    voilà le code que j'ai pondu :
    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
    Dim b2 As New System.Drawing.Bitmap(ctrl.Width, ctrl.Height, BackImg.PixelFormat)
     
     
                    Dim bmpSource As System.Drawing.Imaging.BitmapData
                    Dim bmpDest As System.Drawing.Imaging.BitmapData
     
                    bmpSource = BackImg.LockBits(New Rectangle(ctrl.Location, ctrl.Size), Imaging.ImageLockMode.ReadWrite, BackImg.PixelFormat)
     
                    bmpDest = b2.LockBits(New Rectangle(0, 0, ctrl.Width, ctrl.Height), Imaging.ImageLockMode.ReadWrite, BackImg.PixelFormat)
     
                    Dim b(bmpSource.Width * bmpSource.Height - 1) As Integer
                    System.Runtime.InteropServices.Marshal.Copy(bmpSource.Scan0, b, 0, bmpSource.Width * bmpSource.Height)
                    System.Runtime.InteropServices.Marshal.Copy(b, 0, bmpDest.Scan0, bmpDest.Width * bmpDest.Height)
     
                    BackImg.UnlockBits(bmpSource)
                    b2.UnlockBits(bmpDest)
    les images sont en 24bits
    j'ai pas réussi à utiliser copy pour faire d'une à l'autre, donc je suis passé par un tableau de byte à défaut de mieux, m'enfin y doit me manquer un truc vu que ca marche pas trop

    si quelqu'un sait comment utiliser ce truc .... merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    en convertissant les images en 32bits ca ne plante plus, par contre ca fait pas ce que je voulais, ca a l'air de prendre toute l'image et de la redimensionner pour qu'elle tienne sur la nouvelle image

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    je m'en suis sorti avec 2 tableaux d'integer et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                   For y As Integer = ctrl.Top To ctrl.Bottom - 1
                        For x As Integer = ctrl.Left To ctrl.Right - 1
                            pixelsDest(i) = _ImageCopie(x + y * _BackgroundImageSecondThread.Width)
                            i += 1
                        Next
                    Next
    passé de 6s de traitement à 1s

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] programme pour copier une image d'un dossier a un autre avec c#
    Par Simomis dans le forum C#
    Réponses: 5
    Dernier message: 26/04/2013, 12h01
  2. Utiliser Labview pour afficher une image caméra
    Par SERIEUXETCOOL dans le forum LabVIEW
    Réponses: 2
    Dernier message: 26/07/2012, 21h24
  3. Utilisation Picture pour mettre une image
    Par pcvesoul dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/03/2009, 17h18
  4. [Turbo Pascal] Peut-on utiliser GetPixel pour analyser une image sans l'afficher ?
    Par _Hope_ dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 01/01/2009, 22h07
  5. Réponses: 2
    Dernier message: 20/10/2008, 10h32

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