Android Xamarin — извлекает изображение, сохраненное в imageview

#c# #android #xamarin.android #visual-studio-2017

#c# #Android #xamarin.android #visual-studio-2017

Вопрос:

Я извлекаю изображение в виде массива байт, хранящегося в базе данных, преобразую его в растровое изображение и отображаю его в Imageview. Я хочу иметь возможность извлекать это изображение из Imageview и сохранять его обратно в базу данных. Мой код извлечения из базы данных:

 TheService myService = new TheService.DataInterface();
DataSet MyPhoto = myService.GetPhoto(id);
byte[] imageBytes = (byte[])MyPhoto.Tables[0].Rows[0][0];
Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
imageview.SetImageBitmap(bitmap);
  

В какой-то момент изображение изменяется, и мне нужно сохранить его обратно в базе данных. Как бы мне извлечь изображение из imageview? Все, что я видел до сих пор, касается прикрепленного объекта рисования, в данном случае его нет.

Похоже, не существует метода, подобного:

 Bitmap photo = imageview.GetCurrentImage();
  

Будем признательны за любую помощь.

**** ОБНОВЛЕНО ****

Как только я получу изображение, мне нужно преобразовать его в массив байтов, чтобы сохранить в базе данных. Я безуспешно пробовал несколько разных методов, последний из которых:

 using Java.Nio;
public static byte[] ImageToByte(Bitmap bitmap)
{
    var bytes = new Byte[30000];
    try
    {
        var byteBuffer = ByteBuffer.Allocate(bitmap.ByteCount);
        bitmap.CopyPixelsToBuffer(byteBuffer);
        bytes = byteBuffer.ToArray<byte>();
        return bytes;
    }
    catch (Exception ex)
    {
        var message = ex.Message;
        return bytes;
    }
}
  

Это генерирует исключение «Не удается выполнить преобразование из ‘java / nio / HeapByteBuffer’ в ‘[B'»

Ответ №1:

Что вам нужно сделать, это что-то вроде приведенного ниже:

    BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.Drawable);
    Bitmap bitmap;
    if(bitmapDrawable==null){
        imageView.BuildDrawingCache();
        bitmap = imageView.GetDrawingCache();
        imageView.BuildDrawingCache(false);
    }else
    {
        bitmap = bitmapDrawable .Bitmap;
    }
  

Где ImageView — это элемент управления ImageView, из которого вы хотите получить растровое изображение

Обновить:

Преобразуйте из bitmap в ByteArray что-то вроде этого:

    byte[] bitmapData;
   using (var stream = new MemoryStream())
   { 
  bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
    bitmapData = stream.ToArray();
   }
  

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

1. Это (по-видимому, сработало, пока не уверен, потому что теперь мне нужно преобразовать изображение в массив байтов, чтобы я мог сохранить его в базе данных. Я изменил свой вопрос.

2. Я добавил обновление для вас, и просто чтобы вы знали, если у вас есть требование, при котором вам нужно выполнить несколько действий, вы должны упомянуть об этом в своем вопросе, изменение вопроса после получения ответа — это не то, как работает StackOverflow, задавайте все, что хотите, одним выстрелом, в любом случае, удачи.

3. Спасибо, что все скомпилировано, и я сейчас начну сквозное тестирование. Я опубликую результаты, как только закончу с этим. Да, я должен был опубликовать оба требования, я предполагал, что смогу написать код bytearray самостоятельно. Я предположил неправильно….

4. Сквозные тесты прошли успешно. Спасибо за всю вашу помощь.

5. Я рад помочь, на случай, если вы изучаете xamarin и хотите изучать его дальше, вы можете подписаться на меня на medium и проверить мои блоги! Я каждую неделю что-то пишу в блоге и рассказываю, как это сделать в xamarin. Ссылка в моей биографии, удачного кодирования!