как преобразовать изображение в base64 в xamarin.android?

#android #sql #database #image #xamarin

#c# #изображение #растровое изображение #xamarin.android

Вопрос:

У меня есть этот код, он очень хорошо работает в android studio, но не в xamarin bitmap.Compress() имеет разные аргументы в xamarin, и я не понимаю, как преобразовать изображение в base64 или двоичный файл в xamarin.android?

Я получаю ошибку в 3-й строке:

(bitmap.Compress() имеет некоторые недопустимые аргументы).

 Bitmap bitmap = BitmapFactory.DecodeResource(Resources, Resource.Drawable.ace1);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100,bao);
byte[] ba = bao.ToByteArray();
string bal = Base64.EncodeToString(ba, Base64.Default);
  

Комментарии:

1. Это ошибка времени компиляции или исключение?

2. Как исключения, так и ошибки во время компиляции являются ошибками. Неясно, что это такое. Похоже, это, вероятно, ошибка времени компиляции, но вам следует отредактировать свой вопрос, чтобы он был более четким.

3. @JonSkeet — Я считаю, что это ошибка времени компиляции, согласно моему опыту.

Ответ №1:

Если вы посмотрите документацию на Bitmap.Compress Xamarin, вы увидите, что последним параметром является a Stream .

Эквивалент ByteArrayOutputStream в .NET MemoryStream , поэтому ваш код будет:

 Bitmap bitmap = BitmapFactory.DecodeResource(Resources, Resource.Drawable.ace1);
MemoryStream stream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
byte[] ba = stream.ToArray();
string bal = Base64.EncodeToString(ba, Base64Flags.Default);
  

(Вы могли бы использовать Convert.ToBase64String вместо Base64.EncodeToString , если хотите, тоже.)

Комментарии:

1. в строке byte[] ba = stream ошибка. toArray(); поток не может преобразовать в байт[]

2. @EhsanUllah: Исправлено — в объявлении for stream должен был быть указан тип времени компиляции MemoryStream , поскольку именно там ToArray объявляется.

3. не могли бы вы уточнить свой ответ, Джон?

4. @EhsanUllah: Не уверен, что ты имеешь в виду. Я отредактировал ответ, чтобы указать тип времени компиляции как MemoryStream — теперь он должен работать нормально.

5. Использование @JonSkeet using здесь не рекомендуется? ( для Bitmap и MemoryStream )

Ответ №2:

Вот как я получаю Byte[] для своего Bitmap объекта:

 Byte[] imageArray = null;
Bitmap selectedProfilePic = this.GetProfilePicBitmap ();

if (selectedProfilePic != null) {
    using (var ms = new System.IO.MemoryStream ()) {
        selectedProfilePic.Compress (Bitmap.CompressFormat.Png, 0, ms);
        imageArray = ms.ToArray ();
    }
}
  

Надеюсь, это поможет.