2015-10-19 128 views
3

好吧,我已閱讀所有關於此主題的問題和解答。我一直在閱讀他們幾天,沒有爲我工作,所以我有一個直接的問題。此代碼生成一個字符串Android base64解碼/編碼圖像字符串

public String getStringImage(Bitmap bmp){ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] imageBytes = baos.toByteArray(); 
    input = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    return input; 
} 

而這種代碼生成相同的圖片另一個字符串,

<?php 

$data = file_get_contents('Lake_mapourika_NZ.jpeg'); 
$nova = base64_encode($data); 

    echo $nova; 

?> 

當我將其插入到該代碼回用Java:

public void decodeImage() 
{ 
    byte[] decodedByte = Base64.decode(input, Base64.DEFAULT); 
    bitmap = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); 
    imageView.setImageBitmap(bitmap); 
} 

第一個字符串不會工作第二個工作正常。爲什麼?爲什麼Java到Java不工作和PHP到Java工作正常?

當然,字符串是不同的,這也是一個很好的問題。爲什麼它們從相同位圖生成時有所不同?對我來說,似乎Java解碼工作正常,但編碼不會工作。

我使用此代碼發送我的圖片從應用程序到服務器,所以我不能使用在線轉換器每次它必須被編碼爲字符串從應用程序。我沒有得到任何錯誤,並用我的手機相機拍攝的照片,我得到了內存異常。但是,當質量改爲50時,我得到解碼的字符串,但它不會像往常一樣工作。

有沒有其他方法可以做到這一點?

+1

我可以問你爲什麼你在這裏使用base64嗎? – e4c5

+0

而不是獲取圖像的base64字符串,並將它們隱藏顯示,我建議您將圖像的url作爲參考存儲,它使圖像的url直接在imageview上直接顯示圖像更容易。你可以參考這裏http://stackoverflow.com/questions/348363/what-is-the-best-practice-for-storing-uploaded-images –

+0

'input'應該是一個局部變量,'String input = ... '。這並不能解釋錯誤,所以將這些字節保存在一個文件中,看看'compress'是否工作。也許在'?>'後面有一個換行符(通常是錯誤的),那麼java會需要一個明確的換行符''\ r \ n「'。 –

回答

1

您的代碼存在錯誤,但不是您發佈的代碼。 檢查您編碼的位圖的內容,並檢查解碼時是否使用了正確的輸入字符串變量。

你的編碼,解碼部分工作正常。不過,如果你不依賴成員字段,那麼這個代碼會更好。

public String getStringImage(Bitmap bmp) 
{ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] imageBytes = baos.toByteArray(); 
    String input = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    return input; 
} 

public void decodeImage(ImageView iv, String input) 
{ 
    byte[] decodedByte = Base64.decode(input, Base64.DEFAULT); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); 
    iv.setImageBitmap(bitmap); 
} 

上述編碼/解碼方法的測試代碼 - 修改爲使用參數代替成員字段。

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.thn); 
ImageView iv = (ImageView)findViewById(R.id.image_view1); 
iv.setImageBitmap(bm); 

iv = (ImageView)findViewById(R.id.image_view2); 
String b = getStringImage(bm); 
decodeImage(iv, b); 

回答爲什麼從Java編碼和PHP編碼中獲得不同的base64字符串是相當簡單的。使用PHP,您正在處理圖像文件並對其進行編碼,而對於Java,您可能是以相同的圖像文件開始的,但是首先將其解碼爲位圖,然後將該位圖編碼爲JPEG流(這會產生不同的效果從你開始使用的JPEG圖像),你最終編碼到基地64.

PHP: JPEG file -> base64 

Java: JPEG file -> Bitmap -> JPEG stream (different from JPEG file) -> base 64 
+0

謝謝。你的答案阻止我跳過窗口。我已經失去了幾個小時試圖瞭解這一點。謝謝。 @Dalija Prasnikar –

+0

好吧,所以我設法上傳文件到服務器我已經寫了http實體部分在Java中,並在PHP中接收部分一切正常,但我不斷收到很小的文件,所以我試圖看到我的文件的內容[鏈接](http://stackoverflow.com/questions/33275893/conversion-from-file-to-bitmap-in-android)你能幫我嗎?如果我困擾你,我很抱歉,但我真的需要幫助。 @Dalija Prasnikar –

1

這不是問題的直接答案,但我認爲仍然是正確的答案!這項任務絕對不需要Base64編碼/解碼。

圖像和其它文件所使用的multipart/form-data encoding

內容類型上傳到網絡服務器的「application/X WWW的窗體-urlencoded」是用於發送二進制數據的大量或含有 文本低效 非ASCII字符。內容類型「multipart/form-data」應爲 ,用於提交包含文件,非ASCII數據和 二進制數據的表單。

好消息是你不需要自己編碼。所有流行的http客戶端庫都在內部處理它。您只需告訴他們要上傳哪些文件。這是一個answer,展示瞭如何用Volley做到這一點。這是一個answer,它顯示瞭如何使用loopj異步http客戶端進行操作。

看來你在服務器端使用PHP。正如你非常清楚的那樣,PHP對於接受file uploads提供了很好的內置支持。

Base64編碼/解碼在兩端都不需要。另請注意,當你base64編碼一個二進制文件時,它的大小增加了大約30%,所以你的base64編碼後會增加設備的內存,CPU和數據使用率。

+0

好的。我想我看到了一個解決方案,當我看到這麼多新東西時,我很難圍繞它解決問題。我想投票你的答案,但不幸的是我仍然是一個新手堆棧。非常感謝。我會迴應如果我成功了。 @ e4c5 –

+0

不客氣。所有最好 – e4c5

+0

好吧,所以我設法上傳文件到服務器我已經寫了http實體部分在Java中,並在PHP中接收部分一切工作正常,但我不斷收到很小的文件,所以我試圖看到我的文件的內容[鏈接](http://stackoverflow.com/questions/33275893/conversion-from-file-to-bitmap-in-android)你能幫助我,這是違反這個網站的規則?尋求這樣的幫助?如果是對不起,我不會再打擾任何人了。 :(@ e4c5 –