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

C# Discussion :

convertir bitmapimage en byte


Sujet :

C#

  1. #1
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut convertir bitmapimage en byte
    Bonjour,
    Je cherche à placer une image (100x100) dans un fichier xml donc au format byte[]. La sauvegarde semble bien se passer mais pas la récupérations. Ces codes viennent de internet ce n'est pas moi qui les ai développé.

    code pour mettre dans le xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public byte[] bitmapImageToBytes(BitmapImage image)
            {
                if (image == null) { return null; }
     
                var encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(image));
     
                using (var ms = new MemoryStream())
                {
                    encoder.Save(ms);
                    return ms.ToArray();
                }
            }
    Voici mon XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <image>25521625522401674707370011102300230002552190670322322333343345855445107768121012121110111113141816131417141111162216171920212121121523242220241820212025521906713445459559201311132020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020255192017801000100313402171317125519603100151111110000000012345678910112551960181160213324355440011251230417518334965619819773411320501291451618356617719321822092403651981141309102223242526373839404142525354555657586768697071727374838485868788899099100101102103104105106115116117118119120121122131132133134135136137138146147148149150151152153154162163164165166167168169170178179180181182183184185186194195196197198199200201202210211212213214215216217218225226227228229230231232233234241242243244245246247248249250255196031103111111111000000123456789101125519601811702124434754401211901231745334961865817971131934501298206614516117719393551822402198114209102236522253724123242526383940414253545556575867686970717273748384858687888990991001011021031041051061151161171181191201211221301311321331341351361371381461471481491501511521531541621631641651661671681691701781791801811821831841851861941951961971981992002012022102112122132142152162172182262272282292302312322332342422432442452462472482492502552180123102173170630249171192183235526932128279351991320316236140729228112431621342121103914021551224222219916825195766324122793100351161522051256229479919250163342291509366731112019718317954243362095514944108259314257916834166913220488242732067983836616375338229131447867923390521431671414094246425313899145248821555323312814421142171991082121082031311477788167814525315612712314317370109186243248841741931221581941541725724653661131371990146330244193102241151382101811812511012288034252522040699611100244424043172213180616221592541791041786410218514624214223808331141607414712865415818520545172078280132146107242602491802459614568116224135177639024423240180112172173541411201361421423223999633419115022716736191014320021423139522322441891069185181107351870173112023633188181220733016739219561618915311583168236151228125149251391045853215193109509367741791881841071391432227721879672642535218138631025919717724847161169102271582252549525023822725081951139131120137250179249211551072516619015911095153249205240239732515320618511846386211722813897361219913193321515819116511980130172113210188392542321239133117203251199951971549220115618178281581852281261492182331272825253119177102150123347134104137321943154251286112274154141236207211120115612021052241699715710125691072051661901757725220770231159741132251792482152317125289240222143964619118098188452473318111223812616360126561744211114112219913817413313513411682183181132307611914924719224242453815774240139181238207167197113228913114616742188211123706224312518225310812287140110173227209101130103143204159101455111425504860151062431686051168219235218239218181681582062081928432486203242156227160246616993183240292061593124617417512111317210711473182398020414539152165130129237158223133802098719717824813180155861309997120642183536321846563178230177109201167372531211595115285158431774120154181391233623910110591158206219217219841512042442492458442001836525121364226368313382724224112506374204211188971091219910711738216602001242171441711813598185314212097751697319107803921767202246204194111156291611481093214159541212331381652011811115621582141719824623421915120459124157161674717516529177244207107148175163621661743417816910611513873218214126771162371274721111879182332402312051491634274149104156281331032442542341472488111722675271202161532578662371042201141151402411981181581071481862132374736221113165131561381021537719501752421718312920685143562321062282147316810714415317208202133242361121783104421029193200207185252417718914025501804384186166226245933721510722317421812524658221631999070155167221696118118921218325619617225154352307011215229731942311742821218390165166177432228921916518117219912411333982012222202541171961211861241878146882417322235108146164204858910211451511762009215910815850107164211853517713270158841237016542361517310562195519421515774143153167233123223231165191912491599912431214166210254212481022084109614925496123220752396912144158561842401911322523110529207146173165251182491011791551531981146214887197215139117166252223230127601022133525316194255020747204248261331254181513714110134111142752302432315880493924421234831241324022119613314723715022424472229415204192502131752172550224255013862381248324179252351542920618111316743187199111183402924027146562241431981901419521711122619610019224458828127113792542059422226521251551172619115324615643129202429692241238148212710517116418024523812422716725211240189188158100137117118125117977133255019964174223712081162211031397917913821038601727314025312314794177255012199241896525501381987318819924821273251552528250188952401301079114410025501632502442316021419021013262221512201261451301427112911919558113125211141254253207591949971582445114163147244175686317911119753725440611121591079981159217207226150236127194517525502241921424017379249151222123312188830149161255012947243602062277618218515520710111160391502993148237206113193245197861842082373788247196919798173189178551230115220262451112481031271381112124322615194193255019415225501791911962546322612924122632363139248862202442238497448691432221645324313722955264514121161461319923041343215612816756602407229742188517920417815951204681018618190645620023523663422452225315712639402550145319677244211164255010143254252312261112531925501725502241789524017183167221172451401862472461442152063915219516421891153118198127123184184102442756207424719788134242372278822795465224852442913312211126207191196712720161241322332117615515925211816311112863192311812631248155240210103255022610614972116981425133113016423205301812252550128492528224039132117102212164179491051911021716517072143914917914612721916218914322579133117157312251831351081111651882082393218121753148240170721411891432041741857154432261717725173892451271532522231531861151998714621424215123012123125218103192150241223124872411399217122173168711643717663521041602022061251521861292550922181916818787226175252192112271002550112550107111236169238218452719787181058781222491216513712913625424012714831246200239951817790179230208194163211521331251682491511692072257518721418422910220317697258831051518711389195230742198716029736213018316521207557175137222571782481132241259592187157451902071094414551161101504410820214591241892359165185125677622153229189246226711551101336618201195126852432325220722612581523624322624602149122188381571098602252201111996322120679184175117240109179175135172159123532368069211971966444187130292061148322522172824623411714018515815515991882337338237141176462521131871661071452136011339133236902278318355118192170165213152281509616312210014925352305151233210190103248213251921076252411953619217931041185513116219353614640821671151341252022424312818510120205932016219018410417312415323024393148172749986110931491148571762271464816339129147861711382485924183762482032242959196250802422261845381281822271216327147562523485625428141492188332292391411585024116613522721917111115104144106543721218105951051473200234595252232174255019718218175136181155422720399461126615819521281946716814710310115324843103174792259513720923549221381256385911806181042291415232432506821153853109542102502148515821423036154418022858501301726113634191157223218502262021271391512418989139311782182189178160253249146221227125288199519031244701472406722524514418455982231952181249412311714710918099119227941675022022623599185424319197154132186541462181321011361811133614513001162322172012321221215248107111117121247196633012461142214231662415418916019936209721919921216614113522132146164246252076721418523419753161104181113241877321117290752492371721677613571185661371312121845663133121791431911051751010581187298659251152198213134215144204113192610233951522502151964111615242352670167971002412199360411131034815416506614810555144491311951145720712224457382401341831642181332092457750254878014621693179164139181751801332188018823922581122141141138324598917724337176239218243227132223201755261627068143206146961682178814656206024536176231218191827715725414716510518622214941511518621417111112116719864551451601992031467154164291641562814961653114012650240236232225815461587766246439154124745214546612136124228721601192463236241951712141271811591951573572441174313916821412126117317974178708915310186282035241233199356127104136220225254601248131161801392112251312780240228623014641472393417634127180200254871442013412414013820619935572191292082151946321442312401901611111707517321724814212312171571035210913914013015212514018442664242281222811394197241123226231252382618216361174163105225203137100150231801871054637154112196241472031298987224019204421953956237243103129531432235122149202248243932135213722815065221631317615711220727212168571119204215111331161312407820726889412010319626291888121917192452521719549120213892125612127741423122919916117517710724315124662248392417919515412521513860471415652157125852371115341101130701831220414617212689811875722824259161121262482403113322319412631142206751551372281182431574646602411917627145281701571551787071115208961141204719814313630282401431411651802136221011010013676601471982102045723117484254148875925166120701951963116942341251021581144911701212109452689722314011030191173212282542382501571831596724310724621224829169124582417113412499229180154311401802001119715614182299985154352386286302072361072461552242915625012719219113586183361811966228211163144158187133180962541812412325220357921111063979513511592742051251091682171391928100249140208202172611342041592488175169191101191218127225247199111723315412713418110114394211172337522110240121871182518185142195247212312269214270113156871601461488120121224742240311412231781513419044773725256176213164144203361731511818115215579516735218190129162159323182012550423918955178178948918617832734615154209149012100116192231140242121232654175255042242141102383099168902013863021510094102595813381255012422425121523261211621411371772492271032550425324185157203200194591321441032035515890161231140702352422272920722778155246112411801131989919118613211313912312322921731251574473951747931133125175226792295233186164214246247901244017414516015492289819765193216485735240341702332545321223822917920523814623357852192023271782342558142171692501172261802461111152091429590808391124255020024822112797127252031815324513751281601789369188145212146793224727113233882613525219391966240181751392051051332321481861812017642231129177709192234113212215222582151381179322751237317418015223922966225100142125172160140320812232508596011517232200159692191499214818525119713822723824742248247011916723621671471733616529153228638255010219113725411146205536313815413215411717684138193488199241112020730248233233207212101659901571961211061235207382481371231317283125167711004136242592492321712615622812416414718018115138244241002433371206119011465984202601718342216901521161576919123212612425421615846109392261882220979322191673823714271205231772154115140819411525110123495104248233170466516194145129207281772541911732120383920204164221206912252232371832412722522313518023912911339872114416451912461891792073440563112144116174251196191180772471967317253189871932542313919626115441501222141595205165244132231082419243224247827415822420969681801581311387710612315014125190120210223651821891105558219813813410522414818722714018236253930149175169254214304717917924383792097597126244199915925110769219220625114910121617515237117227253711758110135133321522077255019910612019110763232011642051161162371920476224121199914025502119040163153221106874218219819014725177120163801041321541261425538243182251222550223202207212191106175228920623415411813866227271601512550142209699321617218714139246166241921871110521847356323437255022718114322615921824319826451397761511601877852532291881969962210138401642191762361369925317660993642237165104254215252123772550199107146212191110311365094671072915813310814138194209902031873114016481696816425113314914315162512481342391962550195321925121019012320713122913070142301384017418612710573724151255217</image>
    Voici le code pour récupérer l'image :
    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
     
    public BitmapImage bytesToBitmapImage(byte[] value)
            {
                if (value == null || value.Length == 0) return null;
                var image = new BitmapImage();
                using (var mem = new MemoryStream(value))
                {
                    mem.Position = 0;
                    image.BeginInit();
                    image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                    image.CacheOption = BitmapCacheOption.OnLoad;
                    image.UriSource = null;
                    image.StreamSource = mem;
                    image.EndInit();
                }
                image.Freeze();
                return image;
            }
    "Impossible de trouver un composant d'image adapté pour terminer l'opération."

  2. #2
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Désolé mais le message s'est enregistré trop vite

    Voici les messages d'erreurs :
    "Longueur non valide pour un tableau de caractères Base 64 ou une chaîne."
    "Impossible de trouver un composant d'image adapté pour terminer l'opération."

    obtenus sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image.StreamSource = mem;
    Comme le code est vu et revu sur internet je ne vois pas d'ou ça peux venir

    Dans ma classe je déclare la variable image pour la stocker dans ma list<> avant de la sauvegarder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public BitmapImage image;
    Merci de votre aide

  3. #3
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    va falloir parcourir les fiches MSDN des classes, méthodes et attributs que tu utilises, c/c sans comprendre ne t'apportera que des soucis. Sinon je ne vois aucune référence (directe) à une transfo Base 64, et le content que tu nous files n'est pas du Base 64, du coup je comprends pas bien l'erreur Base 64. A voir dans les fiches MSDN
    Plus je connais de langages, plus j'aime le C.

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Effecitvement, il faut regarder un peu ce qui se passe. Tu sérialises une image Bitmap en utilisant un converter JPEG et tu essaies de le désérialiser directement comme si c'était du Bitmap. Du coup erreur ! Rien d'anormal à ce que cela ne fonctionne pas.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    Je vais regarder et tanté de trouver les infos
    J'ai testé avec plusieurs codes trouvés comme celui ci
    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
     
    public byte[] bitmapImageToBytes(BitmapImage imageSource)
            {
                Stream stream = imageSource.StreamSource;
                Byte[] buffer = null;
                if (stream != null && stream.Length > 0)
                {
                    using (BinaryReader br = new BinaryReader(stream))
                    {
                        buffer = br.ReadBytes((Int32)stream.Length);
                    }
                }
     
                return buffer;
            }
    et pareille erreur. Ce que je ne sais pas, c'est ou est réellement l'erreur quand je converti en Byte[], quand je sauvegarde, que je récupère ou quand je converti en bitmapimage

    Merci pour aide

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Speed41 Voir le message
    Je vais regarder et tanté de trouver les infos
    J'ai testé avec plusieurs codes trouvés comme celui ci
    Il ne s'agit pas de testé aveuglément des codes. Il faut en comprendre le principe.

    Citation Envoyé par Speed41 Voir le message
    et pareille erreur. Ce que je ne sais pas, c'est ou est réellement l'erreur quand je converti en Byte[], quand je sauvegarde, que je récupère ou quand je converti en bitmapimage
    As tu lu mon précédent message ? Tu sérialises un JPEG et tu cherches à désérialiser en BITMAP. Cela ne peut pas marcher ! Ce n'est pas une étape en particulier qui pose problème, c'est la globalité car tu utilises des méthodes incompatibles.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Le principe : un fichier binaire (comme une image) ne peut être directement sérialisé dans un fichier à plat (comme un XML). En effet il a de fortes chances de contenir des octets/jeux d'octets qui ne correspondent pas un caractère dans les différents charset utilisés (UTF8/UTF16 pour XML/.NET). Il faut donc faire une transformation (réversible, pour pouvoir remonter le fichier binaire) qui va changer les bytes en chars sérialisables. Le plus souvent on utilise du Base 64 (ex. certains échanges SOAP, les images dans les RTF ...).

    Il faut donc peut-être ne pas prendre un code tout fait, mais monter un truc from scratch que tu comprendras parfaitement.
    Plus je connais de langages, plus j'aime le C.

  8. #8
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    J'ai bien compris la démarche.
    Cette opération je l'ai réalisée pour windows form mais elle n'est plus valable en WPF

    Je vais reprendre le tout

    Merci

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Cette manipulation ne devrait pas dépendre du framework (winform ou wpf) utilisé pour l'interface graphique.

    Si cela ne fonctionne pas avec l'un d'entre eux, c'est que l'intégration avec le framework est mal fait (usage erroné de l'API)
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    System.Drawing.Image ne fonctionne pas je suis avec le framwork 4 et même avec le 4.5

    Je vais poser la question différemment.

    Je veux sauvegarder une image dans un fichier XML. Mon image est déclarée en BitmapImage est ce la le format le plus adapté ? Je test avec ImageBrush en utilisant .ImageSource. Ou y a t'il un format plus adapté

    Je pensais mettre une variable byte[] dans mon XML pensez vous que c'est le format le mieux ?

    Merci d'avance

  11. #11
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Speed41 Voir le message
    System.Drawing.Image ne fonctionne pas je suis avec le framwork 4 et même avec le 4.5
    Si si, System.Drawing.Image fonctionne très bien avec les frameworks 4 et 4.5. Et heureusement ! Le problème que tu rencontres est plus lié à WPF. Pour utiliser System.Drawing.Image, il faut référencer des assembly supplémentaires.[/QUOTE]

    Citation Envoyé par Speed41 Voir le message
    Je veux sauvegarder une image dans un fichier XML. Mon image est déclarée en BitmapImage est ce la le format le plus adapté ? Je test avec ImageBrush en utilisant .ImageSource. Ou y a t'il un format plus adapté

    Je pensais mettre une variable byte[] dans mon XML pensez vous que c'est le format le mieux ?
    Voilà une question bien posée !
    Tu peux tout à faire convertir un BitmapImage en tableau de byte, que tu peux ensuite retranscrire en Base64 en vue de l'intégrer dans un XML
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private byte[] BitmapSourceToArray(BitmapSource bitmapSource)
    {
        // Stride = (width) x (bytes per pixel)
        int stride = (int)bitmapSource.PixelWidth * (bitmapSource.Format.BitsPerPixel / 8);
        byte[] pixels = new byte[(int)bitmapSource.PixelHeight * stride];
     
        bitmapSource.CopyPixels(pixels, stride, 0);
     
        return pixels;
    }

    Pour convertir un tableau de byte en chaine de caractères base 64, tu peux utiliser Convert.ToBase64String (et Convert.FromBase64String pour l'opération inverse).

    Après, pour recréer ton image à partir du tableau de byte, il faut que tu te tournes vers BitmapSource.Create.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Ok merci pour toutes ces infos.

    Demain matin je regarde pourquoi System.Drawing.Image reste en erreur et je vais pouvoir réutiliser mon code ou en trouver un autre

    Merci pour votre aide

  13. #13
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Comme signalé par Dorin ,tu dois convertir ton array de bytes en string base64 et vice-versa :

    ton code revu:
    code xaml du form :
    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
     
     
    <Window x:Class="WpfImageIntoXML.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" ></RowDefinition>
                <RowDefinition Height="auto" ></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <DockPanel>
                <Button Name="btnSaveImg" Margin="10" Content="SaveImage" Click="btnSaveImg_Click"/>
                <Button Name="btnLoadImg" Margin="10" Content="LodImage" Click="btnLoadImg_Click"/>
            </DockPanel>
            <Image Name="srcImage" Grid.Column="0" Grid.Row="1" Width="150" Source="Images/Penguins.jpg"/>
            <Image Name="dstImage" Grid.Column="1" Grid.Row="1" Width="150" />
        </Grid>
    </Window>
    et son code behind .cs:

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
     
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.IO;
    using System.Xml.Serialization;
    using System.Xml;
    using System.ComponentModel;
     
    namespace WpfImageIntoXML
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            string filename = Directory.GetCurrentDirectory() + "/MyImages.xml";
            public MainWindow()
            {
                InitializeComponent();
            }
     
            private void btnSaveImg_Click(object sender, RoutedEventArgs e)
            {
                byte[] jpegBytes = BitmapImageToJPEG((BitmapSource )srcImage.Source);
     
                TypeConverter converter = TypeDescriptor.GetConverter(typeof(byte[]));
     
                XmlNode imgElement = new XmlDocument().CreateElement("Image", "ns");
                imgElement.InnerXml =Convert.ToBase64String(jpegBytes); //conversion en string base64
     
     
     
                XmlSerializer serializer = new XmlSerializer(typeof(XmlElement));
                using (TextWriter writer = new StreamWriter(filename))
                {
                     serializer.Serialize(writer, imgElement);
                }
     
     
     
            }
     
            private void btnLoadImg_Click(object sender, RoutedEventArgs e)
            {
     
                dstImage.Source = XmlToBitmapImage();
     
     
            }
     
            public BitmapImage XmlToBitmapImage()
            {
     
                XmlSerializer serializer = new XmlSerializer(typeof(XmlElement));
     
                XmlNode imgElement = null;
                using ( FileStream fs = new FileStream(filename, FileMode.Open))
                {
                        imgElement = (XmlNode)serializer.Deserialize(fs);
                }
                string val = imgElement.InnerXml ;
                if (val == null || val.Length==0 ) return null;
     
                byte[] bytes = Convert.FromBase64String(val);////conversion en bytes
     
                var image = new BitmapImage();
                using (var mem = new MemoryStream(bytes))
                {
                    mem.Position = 0;
                    image.BeginInit();
                    image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
                    image.CacheOption = BitmapCacheOption.OnLoad;
                    image.UriSource = null;
                    image.StreamSource = mem;
                    image.EndInit();
                }
                image.Freeze();
                return image;
            }
     
            //encodage en bytes
            public byte[] BitmapImageToJPEG(BitmapSource   image)
            {
                if (image == null) { return null; }
     
                var encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(image));
     
                using (var ms = new MemoryStream())
                {
     
                    encoder.Save(ms);
                    return ms.ToArray();
                }
     
     
            }
        }
    }
    bon code....

  14. #14
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    Ayant retrouvé System.Drawing.Image, j'ai pu réutiliser mes codes que je vous partage.

    Merci pour votre aide

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
            /// <summary>
            /// Convertir un BitmapImage en Byte[]
            /// </summary>
            /// <param name="image">image sous forme de BitmapImage</param>
            /// <returns>image sous forme de byte[]</returns>
            public string bitmapImageToBytes(BitmapImage image)
            {
                Bitmap bmp = BitmapImageToBitmap(image);
     
                TypeConverter converter = TypeDescriptor.GetConverter(typeof(Bitmap));
                return Convert.ToBase64String((byte[])converter.ConvertTo(bmp, typeof(byte[])));
            }
            /// <summary>
            /// Convertir un Byte[] en BitmapImage
            /// </summary>
            /// <param name="imageData">image sous forme de Byte[]</param>
            /// <returns>image sous forme de BitmapImage</returns>
            public BitmapImage bytesToBitmapImage(byte[] imageBytes)
            {
                if (imageBytes == null || imageBytes.Length == 0) return null;
                MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
                ms.Write(imageBytes, 0, imageBytes.Length);
                return ConvertImageToBitmapImage( Image.FromStream(ms, true));
            }
            /// <summary>
            /// Charge l'image et lui change sa résolution
            /// </summary>
            /// <param name="filename">Chemin complet de l'image</param>
            /// <returns>Image</returns>
            public BitmapImage chargeImage(string filename)
            {
                if (!System.IO.File.Exists(filename)) { return null; }
                Uri myuri = new Uri(filename);
                BitmapImage myBitmap = new BitmapImage();
                myBitmap.BeginInit();
                myBitmap.UriSource = myuri;
                myBitmap.DecodePixelHeight = 100;
                myBitmap.DecodePixelWidth = 100;
                myBitmap.EndInit();
                return myBitmap;
            }
            /// <summary>
            /// Converti une image BitmapImage en Bitmap
            /// </summary>
            /// <param name="bitmapImage">BitmapImage à convertir</param>
            /// <returns>Image Bitmap convertie</returns>
            private Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
            {
                using (MemoryStream outStream = new MemoryStream())
                {
                    BitmapEncoder enc = new BmpBitmapEncoder();
                    enc.Frames.Add(BitmapFrame.Create(bitmapImage));
                    enc.Save(outStream);
                    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
     
                    return new Bitmap(bitmap);
                }
            }
            /// <summary>
            /// Converti system.Drawing.Image en BitmapImage
            /// </summary>
            /// <param name="img">L'image à convertir</param>
            /// <returns>l'image convertie</returns>
            public BitmapImage ConvertImageToBitmapImage(Image img)
            {
                using (var memory = new MemoryStream())
                {
                    img.Save(memory, ImageFormat.Bmp);
                    memory.Position = 0;
     
                    BitmapImage bitmapImage = new BitmapImage();
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = memory;
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImage.EndInit();
     
                    return bitmapImage;
                }
            }
    Et ça marche

    Me reste à finir pour l'optimiser si je peux mais maintenant je peux continuer mon développement

    Je reste ouvert à vos remarques

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

Discussions similaires

  1. Convertir BitmapImage en tableau de byte en wpf
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 11/02/2014, 16h52
  2. Convertir un array<Byte>^ en unsigned char*
    Par xxiemeciel dans le forum C++/CLI
    Réponses: 5
    Dernier message: 12/06/2007, 20h23
  3. [VBA-x]Convertir fichier en bytes()
    Par Stef784ever dans le forum Général VBA
    Réponses: 2
    Dernier message: 01/02/2007, 10h11
  4. [debutant]Convertir un pointeur byte en String
    Par patmaba dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/07/2005, 13h34
  5. [Conversion]convertir int[] en bytes[]
    Par tony_big_guy dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2005, 15h47

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