Android Bitmap.Compress выдает байт [] с -1 байтом? - PullRequest
1 голос
/ 24 июля 2011

Это сводит меня с ума!

Я взял изображение и использую метод 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());

Однако, когда я смотрю на первые несколько байтов байта [], он содержит многочисленные -1, а также действительные числа (0-255) и отрицательные числа, такие как -98 и т. Д.

Язатем отправка этих данных по проводам (в формате json), и они не могут преобразовать их в ac # byte [] из-за отрицательных чисел в массиве.Я даже пытался установить компрессор на 0, если компресс что-то делал.

Странно то, что если я конвертирую байты в base64, то передаю, что могу успешно преобразовать строку base64 в байт [] в c # as сохранить изображение.

Что происходит не так?

Заранее спасибо

Джон

1 Ответ

1 голос
/ 24 июля 2011

Java byte подписано (у него нет беззнаковых типов), а C # byte - без знака (для подписанных байтов есть отдельная sbyte);поэтому появляются два немедленных варианта:

  • использовать base-64, который будет защищен от путаницы
  • читать данные как sbyte[] в C #, а затем просто привести значения к byte (за элемент)

Я бы, вероятно, использовал опцию base-64, поскольку она также должна быть меньше, чем представление их в виде чисел на проводе, но в качестве примера преобразования:

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

(добавьте unchecked, если вы используете проверенные контексты, но это редко; непроверенная опция по умолчанию и более распространенная опция).

...