1

我必须向服务器发送一些从相机拍摄的 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)结尾。

如何检查并进行更正?

4

1 回答 1

1

由于照片已上传到 WordPress,因此没有日志猫报告,并且只有轨道是来自 gdlib 的警告。警告包含:“JPEG 文件过早结束”

虽然我解决了问题。我已经实现了检查 byteArray 是否以 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);
于 2013-04-18T19:58:10.450 回答