2013-04-18 51 views
0

我必須向服務器發送從相機拍攝的幾個JPEG文件。當然,他們只是通過文件流來做到這一點。我(每個文件)的代碼看起來如下:Android:JPEG的提前結束

struct3.put("type", "image/jpeg"); 
f = new File(fileName); 
FileInputStream fis = new FileInputStream(f); 
BufferedInputStream bis = new BufferedInputStream(fis); 
byte[] buffer = new byte[(int)f.length()]; 
bis.read(buffer); 
fis.close(); 
struct3.put("bits", buffer); 

畢竟我送一個結構:

Object[] params3 = { bid, login, pass, struct3 }; 
Object response2 = client.send("my_function", params3); 

當我送小文件都是正確的,但是當文件是大我收到「出內存異常「。

我的這個解決方案是壓縮JPEG文件:

struct3.put("type", "image/jpeg"); 
final Options opts = new Options(); 
opts.inSampleSize = 2; 
Bitmap bitmap = BitmapFactory.decodeFile(fileName, opts); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream); 
byte[] byteArray = stream.toByteArray(); 
struct3.put("bits", byteArray); 
Object[] params3 = { bid, login, pass, struct3 }; 
Object response2 = client.send("my_function", params3);  

但是這種方式產生的在服務器端錯誤: 「JPEG文件過早結束」。

在發送JPEG文件之前,有什麼方法可以糾正嗎? 我知道JPEG應該以EOI結尾(0xff,0xfd)。

如何檢查並進行更正?

+0

這意味着你的代碼沒有壓縮的JPEG文件可能會請你給我們登錄貓報告。 –

+0

由於照片上傳到WordPress而沒有登錄貓報告,只有track是來自gdlib的警告。該警告包含:「JPEG文件過早結束」 – cronik

回答

0

由於照片上傳到WordPress而沒有登錄貓報告,並且只有track是來自gdlib的警告。該警告包含:「JPEG文件過早結束」

雖然我解決了這個問題。我實現了程序檢查,如果字節組爲0xFF,0xD9結束,在情況下我不能添加兩個字節:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream); 
byte[] byteArray = stream.toByteArray(); 
int byteToSendSize = byteArray.length; 
boolean proper = ((byteArray[byteArray.length-2])==((byte)0xff)) 
    && ((byteArray[byteArray.length-1])==((byte)0xd9)); 
if(!proper) 
byteToSendSize +=2; 
byte[] byteToSend = new byte[byteToSendSize]; 

for (int i = 0; i < byteArray.length; i++) { 
byteToSend[i] = byteArray[i]; 
} 
if(!proper){ 
    byteToSend[byteArray.length] = (byte) 0xff; 
    byteToSend[byteArray.length+1] = (byte) 0xd9; 
} 
struct3.put("bits", byteToSend);