【问题标题】:Android Bitmap.Compress gives byte[] with -1 bytes?Android Bitmap.Compress 给 byte[] -1 字节?
【发布时间】:2011-07-24 17:05:50
【问题描述】:

这让我有点生气!

我已经拍摄了一张图片,并使用 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[]。

出了什么问题或者我错过了什么。我什至尝试将压缩因子设置为 0,以防压缩正在执行某些操作。

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

怎么了?

提前致谢

乔恩

【问题讨论】:

    标签: c# java android json bytearray


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢 Marc,我会试一试,但我的印象是 base64 增加了大小而不是减小了大小,这就是为什么我只想发送一个纯字节数组。
    • @Jon: BASE64 确实会增加大小(与原始字节相比),但 JSON 会增加更多大小,因此 BASE64 应该是比 JSON 更小的编码。
    • @Jon 正如 Gabe 所说——你不是在发送原始字节 []——你是在发送文本;和整数作为文本比 base-64 大 很多
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多