簡體   English   中英

無法讀取我剛剛保存在Base64中的位圖圖像

[英]Cannot read a Bitmap image that I just saved in Base64

我嘗試加載圖片(PNG),將其保存在文本文件中的Base64中並重新加載,但是從文本加載圖片后,我只會看到淡淡的圖片(黑白,非常丑陋,與原始圖片相差甚遠!)。文件。 我的問題在哪里?

順便說一句,所有示例(從圖像文件加載圖片,保存到base64,從base64加載)均來自SO問題。

首先是從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);
        }

將其保存到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);
        }

並將其從文件加載回:

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);
        }

這是一個簡短的代碼序列,它將JPG文件讀入字節數組,從中創建一個BitmapSource,然后將其編碼為base64字符串並將其寫入文件。

第二步,從文件中讀取base64字符串,進行解碼並創建第二個BitmapSource。

該示例假定存在一些XAML,其中包含兩個分別名為image1image2 Image元素。

第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);

第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);
}

如果需要將已經存在的BitmapSource編碼為字節數組,請使用如下代碼:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM