2011-07-24 9 views
1

これは私を少し怒らせている!私はバイトの最初の数バイトを見てみると、Android Bitmap.Compressは-1バイトでbyte []を返しますか?

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()); 

しかし

私は、画像を撮影してきたし、(以下のように)バイト配列に画像を取得するためにBitmap.Compressメソッドを使用しますそれは

多数-1と同様に有効な数字(0〜255)および-98などのような負の数が含まれています[] Iは、(JSON形式で)、ワイヤ全体でこのデータを送信することだし、それはそれを変換に失敗しました配列内の負の数のためにac#byte []に​​変換します。

何がうまくいかないのか、何か逃したのですか?私は圧縮が何かをしていた場合に圧縮fatorを0に設定しようとしました。

奇妙なことは、私はBASE64にバイトを変換するならば、私は、成功した画像を保存すると、C#で[]バイトにbase64文字列を変換することができることに送信されます。

What's going wrong?事前に

おかげ

ジョン

答えて

1

Javaのbyte C#のbyteが署名されている間(符号付きバイトのための独立したsbyteがある)、(それは符号なしの型を持っていない)に署名されます。ので、2つの即時のオプションが表示されます

  • 使用はベース64混乱
  • に対する免疫あろうC#でsbyte[]としてデータを読み取る、そしてちょうど
(項目当たり) byteに値をキャスト

私はおそらくそれは、ワイヤ上の数字としてそれらを表現するよりも小さくなければならないように、ベース-64オプションを使用しますが、変換の例のようにしたい:

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

(チェックコンテキストを使用している場合はuncheckedを追加しますが、これはまれです。デフォルトはデフォルトであり、共通オプションは選択されていません)。

+0

おかげでマルクは、私がこれをやってみるよしかし、私は単なるバイト配列を送信したかった理由のサイズではなく、それを減少さを増加させた印象をbase64の下にありました。 – Jon

+1

@Jon:BASE64 *はサイズを増やします(生のバイトに比べて)、JSONはサイズをさらに大きくするので、BASE64はJSONよりも小さいエンコードでなければなりません。 – Gabe

+1

Gabeのように@Jonは - 生のバイトを送信していません[] - あなたはテキストを送信しています。テキストとしての整数は基底64よりもずっと大きい* –

関連する問題