我正在開發其上傳用戶選定的照片使用PHP服務器的Windows Phone應用程序。 爲此,我試圖將圖像轉換爲base64並將其張貼到PHP,然後將其解碼回JPG圖像。編碼和解碼 - JPG爲Base64
基於64位字符串被成功發佈到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編碼。 請幫幫我。
謝謝!正如你所指出的那樣,我已經做了修正。但是,編碼仍然存在問題。我已經確保了其他一切,包括PHP解碼,除了base64編碼外,一切正常。 – 2013-03-21 02:18:17
@ShrayanshSharma:但是你還沒有給出任何確切的錯誤。如果你無法使編碼工作,你怎麼能知道解碼是成功的?你怎麼知道這不是解碼失敗?之後的文件是什麼樣的?沒有更多的信息,我們無法幫助你。 – 2013-03-21 06:45:29
見,我在網上解碼的圖像在:http://www.askapache.com/online-tools/base64-image-converter/,然後用上面的PHP腳本解碼,並將其完美地工作。這意味着解碼工作正常。 此外,我的C#應用程序和上面的鏈接的編碼結果是不同的。這顯然意味着在C#中base64編碼存在一些問題。請幫幫我。 – 2013-03-21 13:52:22