Laura Saraiva Ответов: 1

Как преобразовать system.byte[] в растровое изображение?


I'm doing a job for the school but I'm having problems with the images.
I get System.Byte [] from my web service and I've tried several solutions and I can't convert to bitmap and add my ImageView. In my database the column "Image" appears <Binary data>.
Can someone help me? thanks


Here is my android code.
    
    private String NAMESPACE = "http://tempuri.org/";
    private String URL = "http://X.X.X.X/ProjetoFinal/WSGestao.asmx?WSDL";
    private String METHOD_NAME = "List_Images";
    private String SOAP_ACTION = "http://tempuri.org/List_Images";
    private String[] List;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);

        new MyAsyncTask().execute();

    }

    private class MyAsyncTask extends AsyncTask<Void,Void,String[]> {

        protected String[] doInBackground(Void... strings) {

            //connection to the web service
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            androidHttpTransport.debug = true;

            try {
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject response = (SoapObject) envelope.getResponse();

                //Fetch the server's response and add the list
                List = new String[response.getPropertyCount()];

                for (int i = 0; i < response.getPropertyCount(); i++) {

                    List[i] = response.getProperty(i).toString();

                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            return List;
        }


        @Override
        protected void onPostExecute(String[] result) {
            super.onPostExecute(result);


            //convert to Bitmap
            
        }
    }


The web service sends:

    <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    <string>System.Byte[]</string>
    </ArrayOfString>

My method is this:

 [WebMethod]
   public List<string> List_Images()
   {
      List<string> lista = new List<string>();
      SqlConnection conexao = new SqlConnection();
      SqlCommand cmd = new SqlCommand("Select Imagem From Transmontanos", conexao);
      conexao.ConnectionString = "server = X; database = Transmontanos; user = admin; password = admin;";
      conexao.Open();
      SqlDataReader dr = cmd.ExecuteReader();

       while (dr.Read())
       {
          result = dr["Imagem"].ToString();
          lista.Add(result);
       }

         dr.Close();
         conexao.Close();

    return lista;
}


Что я уже пробовал:

общественная статический недействительным setImageViewWithByteArray(просмотреть графическое представление, Byte[] данные) {
Растровое изображение растровое изображение = BitmapFactory.decodeByteArray(данные, 0, данные.длина);
view.setImageBitmap(растровое изображение);

}

Полученный аргумент данных byte [] :

https://drive.google.com/file/d/1fsYCDQmlvFODskRDa_Sw2FR-giEu3MVY/view?usp=sharing

Но растровое изображение равно нулю

phil.o

13 байт-это очень мало для данных растрового изображения. Соответствует ли он количеству байтов соответствующей записи в базе данных?

Laura Saraiva

Да, это исходит из моей базы данных. Тип моего столбца "изображение" - <binary data=""> и возвращает систему.Byte [] и если я конвертирую его в байты, то он выглядит как ссылка

phil.o

Я спрашивал, действительно ли соответствующий столбец имеет 13-байтовые данные. Совпадает ли количество байтов в базе данных с количеством байтов полученных клиентом данных (13)?

Laura Saraiva

Не. Моя колонка в базе данных заполняется примерно так:

0x89504E470D0A1A0A0000000D494844520000050000000400080200000031F16314000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000B1200000B1201D2DD7EFC0000FFA549444154785EEC9D059C...

phil.o

Намного больше, чем 13 байт, так что. Байт 2-персонажи в этом виде шестнадцатеричной строки.
То, что вы получаете на клиенте, отличается от того, что находится в БД. Проблема, по-видимому, находится на сервере.

Laura Saraiva

Может быть, это потому, что строка слишком длинная, чтобы вернуть систему. []

phil.o

Пожалуйста, не ставьте большие блоки кода в комментариях. Лучше используйте виджет "улучшить вопрос" и добавьте эту информацию в свой вопрос.

Laura Saraiva

Извините, я не знал, я новичок на этом форуме

Laura Saraiva

После преобразования моего изображения в base64 в веб-сервисе клиент уже получает другое. Однако мое растровое изображение по-прежнему равно нулю. Но вы также можете найти решение. Вы можете посмотреть по ссылке выше, я обновил ее, чтобы вы могли видеть, как получает клиент.

Richard MacCutchan

Понятия не имею, что это такое, но это не растровое изображение.

David Crow

Для преобразования из byte[] к Bitmap- а вы пробовали:

Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);

1 Ответов

Рейтинг:
2

OriginalGriff

13 байт данных.
Хммм ... это немного подозрительно.
Это та же длина, что и строка "System.Byte[]" и в результате я рискну предположить, что это именно то, что он содержит.

И самая распространенная причина этого заключается в том, что вы вставили данные в БД с помощью конкатенации строк.
Вы можете посмотреть здесь: Почему я получаю "параметр не является допустимым." исключение, когда я читаю изображение из своей базы данных?[^] - он основан на C#, а не на Java, но принципы точно такие же. Как и последствия!


Laura Saraiva

Я не знаю, будет ли это так. Мой столбец "изображение" в базе данных заполняется следующим образом: 0x89504E470D0A1A0A0000000D494844520000050000000400080200000031f16314000000017352474200aece1 ...

но когда я вызываю этот метод, он получает систему.Байт [] и я не знаю почему

OriginalGriff

Посмотрите на свой код:

Список[я] = ответ.метод getproperty(я).метод toString();

Предполагая, что getProperty(i) возвращает массив байтов, все, что делает toString, - это возвращает имя типа объекта teh в виде строки: "System.Byte[]" - он не преобразует его в строку, содержащую сами байты!

Введите преобразование его с помощью Base64 или аналогичного типа, если вы должны передать массив в виде строки.

Laura Saraiva

На android, преобразованный в base64, но дал 13 байт, как эта ссылка не выше

Laura Saraiva

После преобразования моего изображения в base64 в веб-сервисе клиент уже получает другое. Однако мое растровое изображение по-прежнему равно нулю. Но вы также можете найти решение. Вы можете посмотреть по ссылке выше, я обновил ее, чтобы вы могли видеть, как получает клиент.