2012-07-01 85 views
0

我有一個.net ASMX web服務,我正在使用kso​​ap2庫消耗。在服務中,我首先保存用戶圖像並稍後檢索它。但是,一旦我檢索它,字節數組是完好無損的,但BitmapFactory無法解碼並返回null。保存圖像字節數組到.net webservice並檢索它

要轉換到字節數組:

Bitmap viewBitmap = Bitmap.createBitmap(imageView.getWidth(), 
imageView.getHeight(), Bitmap.Config.ARGB_8888); 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
viewBitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos); 
byte[] bitmapdata = bos.toByteArray(); 

web服務接受字節[]格式的ByteArray。

到陣列轉換成位圖:

byte[] blob= info.get(Main.KEY_THUMB_BYTES).getBytes(); 
Bitmap bmp=BitmapFactory.decodeByteArray(blob,0,blob.length); // Return null :(
imageView.setImageBitmap(bmp); 

從局部分析,似乎字節數組不改變。那麼爲什麼解碼返回null?有沒有更好的保存圖像並通過web服務傳遞?我沒有分析整個字節數組,所以我猜它可能已經改變了一點。

有什麼想法?非常感謝!

UPDATE: 我剛試過的byte []轉換爲字符串使用:

Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT); 

和解碼使用:

byte[] blob= Base64.decode(info.get(Main.KEY_THUMB_BYTES)); 

現在我得到的是一個圖片。我不確定這裏有什麼問題。請幫忙。

UPDATE: 我存儲這個圖像數據庫的內部,在類型爲varchar(最大)的柱中。我應該將這個字節數組字符串存儲在不同的sql數據類型中嗎?我對SQL不太熟悉,所以我使用了varchar,因爲它沒有將文本轉換爲unicode,我認爲這可能對字節數組很好。

謝謝!

回答

0

轉換您的字節數組爲Base64這是一個字符串,易轉移:

public static String bitmapToBase64(Bitmap bitmap) { 
     byte[] bitmapdata = bitmapToByteArray(bitmap); 
     return Base64.encodeBytes(bitmapdata); 
    } 

    public static byte[] bitmapToByteArray(Bitmap bitmap) { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos); 
     byte[] bitmapdata = bos.toByteArray(); 
     return bitmapdata; 
    } 

public static Bitmap base64ToBitmap(String strBase64) throws IOException { 
    byte[] bitmapdata = Base64.decode(strBase64); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata, 0, 
      bitmapdata.length); 
    return bitmap; 
} 

,你也可以做到這一點,不僅在圖像文件,而且對每個文件類型:

public static String fileToBase64(String path) throws IOException { 
    byte[] bytes = fileToByteArray(path); 
    return Base64.encodeBytes(bytes); 
} 

public static byte[] fileToByteArray(String path) throws IOException { 
    File imagefile = new File(path); 
    byte[] data = new byte[(int) imagefile.length()]; 
    FileInputStream fis = new FileInputStream(imagefile); 
    fis.read(data); 
    fis.close(); 
    return data; 
} 


public static void base64ToFile(String path, String strBase64) 
     throws IOException { 
    byte[] bytes = Base64.decode(strBase64); 
    byteArrayTofile(path, bytes); 
} 

public static void byteArrayTofile(String path, byte[] bytes) 
     throws IOException { 
    File imagefile = new File(path); 
    File dir = new File(imagefile.getParent()); 
    if (!dir.exists()) { 
     dir.mkdirs(); 
    } 
    FileOutputStream fos = new FileOutputStream(imagefile); 
    fos.write(bytes); 
    fos.close(); 
} 
+0

我試過你告訴我的,而且我還是得到一張白色的圖像。我想知道這是否與web服務或數據庫有關。我將圖像存儲爲varchar(max),我應該使用不同的類型嗎? – harsimranb

+0

發送給Webservice的base64的值是否與從其接收到的base64的值相同? – breceivemail

+0

好吧,看來....它看起來差不多,但我沒有把它比作它,因爲它相當大......我可以在幾分鐘內確認這一點....... – harsimranb

相關問題