Android Bitmap.Compress为byte []提供-1个字节?

时间:2011-07-24 17:05:50

标签: c# java android json bytearray

这让我有点生气!

我拍摄了一张图片并使用Bitmap.Compress方法将图像转换为字节数组(如下所示)

InputStream is = MyActivity.this.getContentResolver().openInputStream(imageUri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; //try to decrease decoded image
options.inPurgeable = true; //purgeable to disk
Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 20, bos);
myModel.setFullImage(bos.toByteArray());

然而,当我看一下byte []的前几个字节时,它包含多个-1以及有效数字(0-255)和负数如-98等。

然后我通过线路(以json格式)发送这些数据,并且无法将其转换为c#byte [],因为数组中的负数。

出了什么问题或者我错过了什么。我甚至尝试将压缩fator设置为0,以防压缩正在做某事。

奇怪的是,如果我将字节转换为base64然后传输,我可以成功地将base64字符串转换为c#中的byte []以保存图像。

出了什么问题?

提前致谢

乔恩

1 个答案:

答案 0 :(得分:1)

Java的byte已签名(它没有无符号类型),而C#的byte是无符号的(签名字节有单独的sbyte);所以出现两个直接选项:

  • 使用base-64,它将免于混淆
  • 在C#中将数据读作sbyte[],然后将值转换为byte(每个项目)

我可能会使用base-64选项,因为它也应该小于将它们表示为线上的数字,但作为转换的示例:

sbyte[] orig = ...
byte[] munged = Array.ConvertAll(orig, x => (byte)x);

(如果您使用的是已检查的上下文,请添加unchecked,但这种情况很少见;未选中是默认选项和mire common选项。)