Impossible de lire une image Bitmap que je viens d'enregistrer dans Base64

Meilleur

J'essaie de charger une image (PNG), de la sauvegarder en Base64 dans un fichier texte et de la recharger, mais je ne vois que des images glibres (noir et blanc, très moche, loin de l'original!) Après avoir chargé l'image à partir du texte fichier. Où est mon problème?

BTW tous les exemples (charger l'image à partir du fichier image, enregistrer dans base64, charger à partir de base64) sont tous tirés de questions SO.

Tout d'abord, c'est comment charger les images à partir du fichier PNG:

try
        {
            var openFileDialog = new OpenFileDialog
                                     {
                                         CheckFileExists = true,
                                         Multiselect = false,
                                         DefaultExt = "png",
                                         InitialDirectory =
                                             Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
                                     };
            if (openFileDialog.ShowDialog() == true)
            {
                Bitmap img;
                using (var stream = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    img = new Bitmap(stream);
                }
                Logo.Source = BitmapToImageSource(img);
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.ToString(), "An error occured", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

Enregistrez-le en base64:

try
        {
            Bitmap img = BitmapSourceToBitmap2((BitmapSource) Logo.Source);

            string base64String;

            using (var stream = new MemoryStream())
            {
                img.Save(stream, ImageFormat.Png);
                byte[] imageBytes = stream.ToArray();
                base64String = Convert.ToBase64String(imageBytes);
            }

            string fileName = string.Format(CultureInfo.InvariantCulture, "image{0:yyyyMMddHHmmss}.txt",
                                            DateTime.Now);
            string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), fileName);

            using (var stream = File.Open(path, FileMode.CreateNew, FileAccess.Write, FileShare.None))
            {
                using (var writer = new StreamWriter(stream, System.Text.Encoding.UTF8))
                {
                    writer.Write(base64String);
                    writer.Flush();
                }
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.ToString(), "An error occured", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

BitmapSourceToBitmap2:

int width = srs.PixelWidth;
        int height = srs.PixelHeight;
        int stride = width*((srs.Format.BitsPerPixel + 7)/8);
        IntPtr ptr = IntPtr.Zero;
        try
        {
            ptr = Marshal.AllocHGlobal(height*stride);
            srs.CopyPixels(new Int32Rect(0, 0, width, height), ptr, height*stride, stride);
            using (var btm = new Bitmap(width, height, stride, PixelFormat.Format1bppIndexed, ptr))
            {
                // Clone the bitmap so that we can dispose it and
                // release the unmanaged memory at ptr
                return new Bitmap(btm);
            }
        }
        finally
        {
            if (ptr != IntPtr.Zero)
                Marshal.FreeHGlobal(ptr);
        }

Et rechargez-le à partir du fichier:

try
        {
            var openFileDialog = new OpenFileDialog
                                     {
                                         CheckFileExists = true,
                                         Multiselect = false,
                                         DefaultExt = "txt",
                                         InitialDirectory =
                                             Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
                                     };
            if (openFileDialog.ShowDialog() == true)
            {
                string base64String;
                using (FileStream stream = File.Open(openFileDialog.FileName, FileMode.Open))
                {
                    using (var reader = new StreamReader(stream))
                    {
                        base64String = reader.ReadToEnd();
                    }
                }

                byte[] binaryData = Convert.FromBase64String(base64String);

                var bi = new BitmapImage();

                bi.BeginInit();
                bi.StreamSource = new MemoryStream(binaryData);
                bi.EndInit();

                Logo.Source = bi;
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.ToString(), "An error occured", MessageBoxButton.OK, MessageBoxImage.Warning);
        }
Clemens

Voici une séquence de code court qui lit un fichier JPG dans un tableau d'octets, crée une BitmapSource à partir de celui-ci, puis l'encode dans une chaîne de base64 et l'écrit dans un fichier.

Dans une seconde étape, la chaîne base64 est lue à partir du fichier, décodée et une seconde BitmapSource est créée.

L'exemple suppose qu'il existe du XAML avec deux éléments Image nommés image1et image2.

Étape 1:

var imageFile = @"C:\Users\Clemens\Pictures\DSC06449.JPG";
var buffer = File.ReadAllBytes(imageFile);

using (var stream = new MemoryStream(buffer))
{
    image1.Source = BitmapFrame.Create(
        stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}

var base64File = @"C:\Users\Clemens\Pictures\DSC06449.b64";
var base64String = System.Convert.ToBase64String(buffer);

File.WriteAllText(base64File, base64String);

Étape 2:

base64String = File.ReadAllText(base64File);
buffer = System.Convert.FromBase64String(base64String);

using (var stream = new MemoryStream(buffer))
{
    image2.Source = BitmapFrame.Create(
        stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}

Au cas où vous auriez besoin d'encoder une BitmapSource déjà existante dans un tableau d'octets, utilisez un code comme celui-ci:

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));

using (var stream = new MemoryStream())
{
    encoder.Save(stream);
    buffer = stream.ToArray();
}

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Impossible d'affirmer un champ que je viens de remplir

Comment positionner une zone de texte dans Word que je viens d'ajouter à une page

Comment placer une image de marque d'eau sur une image que je viens de prendre en photo sous Android?

Afficher les données que je viens d'insérer dans la base de données

Impossible d'enregistrer une image dans la base de données à l'aide de Django

Comment enregistrer un petit fichier que je viens de modifier dans mongodb?

PHP - Impossible d'enregistrer la chaîne Base64 dans un fichier image

Impossible d'enregistrer une image dans <canvas>

Android - Obtenez l'URI de l'image que je viens de prendre (sans enregistrer à nouveau l'image)

Image d'intervention - enregistrer dans une variable au format encodé en base64

Carte de Voronoi: impossible de trouver les données que je viens d'associer à un objet

Comment lire une image distante dans une URL de données base64

Impossible de créer une base de données ou une table Hive, je viens de configurer une machine virtuelle centOS 6.4 et d'installer Hive

Enregistrer une image bitmap dans un programme de peinture

Comment lire une image base64 dans MATLAB?

Comment convertir une image base64 en une image et l'enregistrer dans le système de fichiers

Comment puis-je enregistrer une image en tant que fichier image Bitmap?

Pourquoi n'ai-je pas besoin d'importer une classe que je viens de créer pour l'utiliser dans ma classe principale? (Java)

Comment puis-je enregistrer un fichier que je viens de créer dans le dossier que je veux en java?

Impossible de télécharger l'image dans la base de données en raison d'une erreur Base64

Comment lire et enregistrer une image base64 avec FS

impossible d'utiliser l'image base64 de css dans la balise img

Impossible de convertir le chemin base64 en chemin d'image dans Ionic 4

Comment enregistrer une image PNG côté serveur, à partir d'une chaîne de données base64

Pourquoi whereis() renvoie-t-il undefined alors que je viens d'enregistrer le processus ?

nHibernate essaie de mettre à jour SQL une entité que je viens de créer, plutôt que d'INSÉRER ?

impossible de rendre transparent les pixels d'une image bitmap

Django - Impossible d'enregistrer une bibliothèque de balises

convertir base64 ou lien d'image en une image sans enregistrer l'image

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Exporter la table de l'arborescence vers CSV avec mise en forme

  3. 3

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  4. 4

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  9. 9

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  10. 10

    php ajouter et fusionner des données de deux tables

  11. 11

    Créer un système Buzzer à l'aide de python

  12. 12

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  13. 13

    Comment changer la couleur de la police dans R?

  14. 14

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  15. 15

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    comment afficher un bouton au-dessus d'un autre élément ?

  18. 18

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  19. 19

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  20. 20

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  21. 21

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

chaudétiquette

Archive