【问题标题】:Encode and Decode - JPG to base64编码和解码 - JPG 到 base64
【发布时间】:2013-03-20 17:52:30
【问题描述】:

我正在开发一个 Windows Phone 应用程序,它使用 PHP 将用户选择的照片上传到服务器。 为此,我正在尝试将图像转换为 base64 并将其发布到 PHP 中,然后将其解码回 JPG 图像。

base64 字符串已成功发布到 PHP,但我总是在服务器上得到一个损坏的 JPG 文件而不是原始图像(这意味着图像的编码/解码存在一些错误)。

Application 的 C# 代码是:

public partial class SamplePage : PhoneApplicationPage
    {
        public SamplePage()
        {
            InitializeComponent();
        }

        PhotoChooserTask selectphoto = null;

        private void SampleBtn_Click(object sender, RoutedEventArgs e)
        {
            selectphoto = new PhotoChooserTask();
            selectphoto.Completed += new EventHandler<PhotoResult>(selectphoto_Completed);
            selectphoto.Show();
        }

        void selectphoto_Completed(object sender, PhotoResult e)
        {
            if (e.TaskResult == TaskResult.OK)
            {
                BinaryReader reader = new BinaryReader(e.ChosenPhoto);
                image1.Source = new BitmapImage(new Uri(e.OriginalFileName));
                txtBX.Text = e.OriginalFileName;

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://"+QR_Reader.MainPage.txtBlck+"/beamer/saveimage.php");
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";

                Stream photoStream = ImageToStream(image1);
                BitmapImage bimg = new BitmapImage();
                bimg.SetSource(photoStream); //photoStream is a stream containing data for a photo

                byte[] bytearray = null;
                using (MemoryStream ms = new MemoryStream())
                {
                    WriteableBitmap wbitmp = new WriteableBitmap(bimg);
                    wbitmp.SaveJpeg(ms, wbitmp.PixelWidth, wbitmp.PixelHeight, 0, 100);
                    ms.Seek(0, SeekOrigin.Begin);
                    bytearray = ms.GetBuffer();
                }
                string str = Convert.ToBase64String(bytearray);

                string postData = String.Format("image={0}", str);   

                // Getting the request stream.
                request.BeginGetRequestStream
                (result =>
                {
                    // Sending the request.
                    using (var requestStream = request.EndGetRequestStream(result))
                    {
                        using (StreamWriter writer = new StreamWriter(requestStream))
                        {
                            writer.Write(postData);
                            writer.Flush();
                        }
                    }

                    // Getting the response.
                    request.BeginGetResponse(responseResult =>
                    {
                        var webResponse = request.EndGetResponse(responseResult);
                        using (var responseStream = webResponse.GetResponseStream())
                        {
                            using (var streamReader = new StreamReader(responseStream))
                            {
                                string srresult = streamReader.ReadToEnd();
                            }
                        }
                    }, null);
                }, null);

            }  // end of taskresult == OK           
        }  // end of select photo completed

        private Stream ImageToStream(Image image1)
        {
            WriteableBitmap wb = new WriteableBitmap(400, 400);

            wb.Render(image1, new TranslateTransform { X = 400, Y = 400 });

            wb.Invalidate();
            Stream myStream = new MemoryStream();

            wb.SaveJpeg(myStream, 400, 400, 0, 70);

            return myStream;
        }
    }  // End of Class

服务器端解码保存图片的PHP代码为:

<?php
function base64_to_image( $imageData, $outputfile ) {
    // encode & write data (binary)
    $ifp = fopen( $outputfile, "wb" );

    fwrite( $ifp, base64_decode( $imageData ) );
    fclose( $ifp );
    // return output filename 
    return( $outputfile );
}       

if (isset($_POST['image'])) {
    base64_to_image($_POST['image'], "img.jpg");
}
else
    die("no image data found");
?>

我不知道这里出了什么问题。 我一直在寻找几个小时来做​​到这一点,但我仍然失败了。

请帮帮我。

编辑: 我刚刚发现无论我选择什么图像,我总是得到相同的 base64 字符串。 这是base64转换后得到的: http://textuploader.com/?p=6&id=vWZy

我现在真的很困惑。我为每个非常图像得到相同的输出。 我不知道为什么会这样。

我真的很想这样做,但我被困在这里,使用 base64 编码。 请帮帮我。

【问题讨论】:

    标签: c# windows-phone-7 file-upload base64 decoding


    【解决方案1】:

    这可能不是问题的全部,但是这段代码被破坏了:

    byte[] bytearray = null;
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmap wbitmp = new WriteableBitmap(bimg);
        wbitmp.SaveJpeg(ms, wbitmp.PixelWidth, wbitmp.PixelHeight, 0, 100);
        ms.Seek(0, SeekOrigin.Begin);
        bytearray = ms.GetBuffer();
    }
    

    通过使用GetBuffer,您将获得可能比真实 数据更大的底层缓冲区。您可以改用ToArray - 而且您不需要在使用GetBufferToArray 之前“倒带”流:

    byte[] bytearray = null;
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmap wbitmp = new WriteableBitmap(bimg);
        wbitmp.SaveJpeg(ms, wbitmp.PixelWidth, wbitmp.PixelHeight, 0, 100);
        bytearray = ms.ToArray();
    }
    

    如果这不起作用,您应该仔细查看之前和之后的文件,最好是在二进制文件编辑器中:

    • 它们的大小是否相同?
    • 它们有何不同,有何不同?有什么规律吗?

    【讨论】:

    • 谢谢!正如你所指出的,我已经进行了更正。但是,编码仍然存在问题。我已经确保了其他一切,包括 PHP 的解码,除了 base64 编码之外,一切都工作正常。
    • @ShrayanshSharma:但是你仍然没有给出确切的问题的迹象。如果您无法使编码正常工作,您如何知道解码成功?你怎么知道不是解码失败了?之后的文件是什么样子的?如果没有更多信息,我们将无法为您提供帮助。
    • 看,我在askapache.com/online-tools/base64-image-converter在线解码了图像,然后用上面的PHP脚本对其进行了解码,效果很好。这意味着解码工作正常。此外,我的 C# 应用程序的编码结果和上面的链接不同。这显然意味着 C# 中的 base64 编码存在一些问题。请帮帮我。
    • @ShrayanshSharma:您的 C# 应用程序正在将图像重写为 JPEG。所以我很可能期望结果会有所不同。您应该在 C# 代码中将结果 not 以 base64 格式写入文件。然后在 base64 中对其进行编码,并执行类似的诊断。基本上有很多事情你可以做,而我们做不到。
    • 嘿嘿,我认真地认为函数private Stream ImageToStream(Image image1) 有问题。我不知道,因为我只是在某个地方找到了它,并尝试在我的代码中使用它。另外,我不知道为什么: WriteableBitmap(400, 400);使用,我的意思是为什么尺寸限制为 400x400。你能帮我解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多