1

ユーザーが選択した写真を PHP を使用してサーバーにアップロードする Windows Phone アプリケーションを開発しています。このために、画像をbase64に変換してPHPにPOSTし、デコードしてJPG画像に戻そうとしています。

base64 文字列は正常に PHP に送信されますが、サーバーで元の画像ではなく破損した JPG ファイルが常に取得されます (画像のエンコード/デコードにエラーがあることを意味します)。

アプリケーションの 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エンコーディングでここに行き詰まっています。私を助けてください。

4

1 に答える 1

0

すべての問題ではないかもしれませんが、このコードは壊れています:

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よりもかなり大きい可能性のある基になるバッファを取得できます。代わりに使用できます。またはを使用する前にストリームを「巻き戻す」必要はありません。ToArrayGetBufferToArray

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

それがうまくいかない場合は、理想的にはバイナリファイルエディタで、前後のファイルをよく見る必要があります。

  • それらは同じサイズですか?
  • それらはどこで、どのように異なりますか?パターンはありますか?
于 2013-03-20T17:56:08.037 に答える