0

PhotoChooserTask で選択した画像を php サーバーにアップロードし、サーバーにファイルを書き込もうとしました。エンコードに UTF8 を使用しましたが、サーバーでは、元の画像のサイズに関係なく、1 キロバイトのファイルしか取得できません。それをbase64stringにエンコードし、サーバーでデコードしました。今、サイズが 4/3*imagesize (デコードなし) のファイルを取得しましたが、デコード後は画像を取得できません (ファイルサイズは元のファイルサイズと同じです)。私は多くの方法で(画像を読むために)試しましたが、これを解決できませんでした.何が問題なのですか?または、他の方法を提案できますか?

クライアントのコード:

  PhotoChooserTask selectphoto = new PhotoChooserTask();
         selectphoto.Completed += new EventHandler<PhotoResult>(photoChooserTask_Completed);
        selectphoto.Show();




     void photoChooserTask_Completed(object sender, PhotoResult e)
                {
                    if (e.TaskResult == TaskResult.OK)
                    {
        System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage();
                        bmp.SetSource(e.ChosenPhoto);
                      byte[] data = null;
                    using (MemoryStream stream = new MemoryStream())
                        {
                            WriteableBitmap wBitmap = new WriteableBitmap(bmp);
                            wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
                            stream.Seek(0, SeekOrigin.Begin);
                            data = stream.GetBuffer();

                        }
         string utfData = System.Text.Encoding.UTF8.GetString(data, 0, data.Length);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.49/xampp/imageserver.php");
                    request.Method = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                    postData = String.Format("image={0}", utfData);   

                    // 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();
                                        System.Diagnostics.Debug.WriteLine("sssssrreeeeeessssulllltttttt========="+srresult);
                                    }
                                }
                            }, null);
                        }, null);
    }

サーバー内:

<?php
if (isset($_POST['image'])) {
 $ifp = fopen( "withoutdecode.txt", "wb" );
    fwrite( $ifp, (($_POST['image'])) );
    fclose( $ifp );
$ifp2 = fopen( "theImage.png", "wb" );
    fwrite( $ifp2, utf8_decode(($_POST['image'])) );
    fclose( $ifp2 );
}
else
{
    die("no image data found");
echo "fail";
}
?>
4

2 に答える 2

1

これを試して :

WP側(画像リサイズアルゴリズムあり)

// 画像を文字列に変換

public string ImageToByte(BitmapImage imageSource) { MemoryStream ms = new MemoryStream(); WriteableBitmap wb = new WriteableBitmap(imageSource); wb.SaveJpeg(ms, imageSource.PixelWidth, imageSource.PixelHeight, 0, 100); byte[] imageBytes = ms.ToArray();

        string result = Convert.ToBase64String(imageBytes);
        return result;
    }

// 写真選択タスクが完了しました

BitmapImage image = new BitmapImage(); image.SetSource(e.ChosenPhoto);

                string fileName = DateTime.Now.Ticks.ToString() + ".jpg";

                State["filename"] = fileName;

                // Load the picture back into our image
                BitmapImage b = new BitmapImage();
                b.CreateOptions = BitmapCreateOptions.None;
                b.SetSource(e.ChosenPhoto);

                double actualHeight = b.PixelHeight;
                double actualWidth = b.PixelWidth;
                double maxHeight = 600;
                double maxWidth = 800;
                double imgRatio = actualWidth / actualHeight;
                double maxRatio = maxWidth / maxHeight;
                double compressionQuality = 0.5;

                if (actualHeight > maxHeight || actualWidth > maxWidth)
                {
                    if (imgRatio < maxRatio)
                    {
                        //adjust width according to maxHeight
                        imgRatio = maxHeight / actualHeight;
                        actualWidth = imgRatio * actualWidth;
                        actualHeight = maxHeight;
                    }
                    else if (imgRatio > maxRatio)
                    {
                        //adjust height according to maxWidth
                        imgRatio = maxWidth / actualWidth;
                        actualHeight = imgRatio * actualHeight;
                        actualWidth = maxWidth;
                    }
                    else
                    {
                        actualHeight = maxHeight;
                        actualWidth = maxWidth;
                    }
                }

                int newh = Convert.ToInt32(ActualHeight);
                int neww = Convert.ToInt32(actualWidth);

                WriteableBitmap wb = new WriteableBitmap(b);
                WriteableBitmap wb1 = wb.Resize(neww, newh, WriteableBitmapExtensions.Interpolation.Bilinear);

                // Save the image into isolated storage
                using (IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    using (IsolatedStorageFileStream targetStream = isStore.OpenFile(fileName, FileMode.Create, FileAccess.Write))
                    {
                        WriteableBitmap bitmap = new WriteableBitmap(wb1);
                        bitmap.SaveJpeg(targetStream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 70);
                        byte[] content = new byte[e.ChosenPhoto.Length];
                        e.ChosenPhoto.Read(content, 0, content.Length);
                        targetStream.Write(content, 0, content.Length);
                        targetStream.Flush();
                    }
                }

                BitmapImage fbmp = new BitmapImage();
                using (MemoryStream ms = new MemoryStream())
                {
                    wb1.SaveJpeg(ms, neww, newh, 0, 100);
                    fbmp.SetSource(ms);
                }

                string img64 = ImageToByte(fbmp);

どこでやっているかと同じように、img64 をサーバーに送信します。そしてそれはうまくいくはずです

于 2013-10-01T10:52:53.443 に答える
0

私は最終的に私の解決策を得ました。

問題は-エンコードとデコードにBase64を使用したため、ネットワークで安全でない文字もエンコードされていました.それらは「+」、「/」、および「=」でした. この文字はサーバーで見つかりませんでした。そのため、「+」、「/」を「-」、「_」に置き換え、「=」を削除しました。サーバーでは、反対の作業が行われました (編集された base64 の decdoing文字列を元の base64 文字列に戻します)。デコード後にサーバーで画像を取得しました。

于 2013-10-03T05:17:39.400 に答える