#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. Ссылка в моей биографии, удачного кодирования!