2013-03-20 173 views
1

我正在開發其上傳用戶選定的照片使用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編碼。 請幫幫我。

回答

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,你會得到基本的緩衝區,很可能比實際數據更大。您可以使用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(); 
} 

如果不工作,你應該在仔細看前後文件,最好在二進制文件編輯器中:

  • 它們是否具有相同的大小?
  • 如果它們有什麼不同,又如何呢?有什麼模式嗎?
+0

謝謝!正如你所指出的那樣,我已經做了修正。但是,編碼仍然存在問題。我已經確保了其他一切,包括PHP解碼,除了base64編碼外,一切正常。 – 2013-03-21 02:18:17

+0

@ShrayanshSharma:但是你還沒有給出任何確切的錯誤。如果你無法使編碼工作,你怎麼能知道解碼是成功的?你怎麼知道這不是解碼失敗?之後的文件是什麼樣的?沒有更多的信息,我們無法幫助你。 – 2013-03-21 06:45:29

+0

見,我在網上解碼的圖像在:http://www.askapache.com/online-tools/base64-image-converter/,然後用上面的PHP腳本解碼,並將其完美地工作。這意味着解碼工作正常。 此外,我的C#應用​​程序和上面的鏈接的編碼結果是不同的。這顯然意味着在C#中base64編碼存在一些問題。請幫幫我。 – 2013-03-21 13:52:22