2015-06-23 2 views
0

Как разработчик .net, новый для android, я пытаюсь использовать изображения с моего asmx webservice. Изображения сохраняются в db как nvarchar (bytearray), поэтому мой веб-сервис возвращает строку, которая может быть преобразована в растровое изображение. Все это прекрасно работает, но у меня возникают проблемы с попыткой получить png-изображения с прозрачными частями. Независимо от того, что я пытаюсь, прозрачные части всегда белые. Проблема в том, что здесь может быть несколько вещей, которые я делаю неправильно ...android image serialization transparent png

Так я пишу свой png для db (C#) (может быть, я уже теряю прозрачность здесь?) :

Image toAdd = Image.FromFile(@"I:\Andoid\h1graph.png"); 

    string imagestring = System.Convert.ToBase64String(imageToByteArray(toAdd)); 

И это путь, я потребляю его на моем приложении для Android:

Bitmap bmp; 

    androidHttpTransport.call(SOAP_ACTION, envelope); 

    SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); 

    String result = resultsRequestSOAP.toString(); 

    if (!result.equals("")) { 

       byte[] bloc = Base64.decode(result, Base64.DEFAULT); 

       bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length); 

       bmp.setHasAlpha(true); 

       ByteArrayOutputStream os = new ByteArrayOutputStream(); 

       bmp.compress(Bitmap.CompressFormat.PNG, 100, os); 

       byte[] bloc2 = os.toByteArray(); 

       Bitmap bPNGCompress = BitmapFactory.decodeByteArray(bloc2, 0, bloc2.length); 

       viewModel.setThreeD(bPNGCompress) ; 

    } 

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

Я предполагаю, это потому, что BitmapFactory.DecodeByteArray создает растровое изображение без прозрачности, поэтому остальная часть кода преобразования не создаст прозрачность.

Я боюсь уже несколько дней, пытаясь найти решения, но я, кажется, не нахожу его. Должна быть лучшая практика для использования png-изображений из веб-службы, сериализована как строка (?).

Использование png из ресурсов, работает нормально с прозрачностью, поэтому я знаю, что мой png прозрачен, а элементы управления пользовательского интерфейса в порядке. (Я знаю, что кодирование не соответствует уровню техники, но чтобы избежать необходимости копировать все виды методов, я заменил некоторый код, который обычно используется в методах, чтобы сделать его более читаемым)

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

ответ

0

Попробуйте явную конфигурацию альфа для операции декодирования:

BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inPreferredConfig = Bitmap.Config.ARGB_8888;

//, а затем вызвать decodeByteArray с явным альфа вариант:

bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length, opts);

// а затем применить то же самое варианты для сжатой версии bmp:

Bitmap bPNGCompress = BitmapFactory.decodeByteArray(bloc2, 0, bloc2.length);

Обновление Я написал простое тестовое приложение для проверки кода и работает правильно (т. Е. Имеет прозрачность). Это 100%, что вы потеряли биты ALPHA перед обработкой изображения.

Заполнитель макета:

<ImageView android:background="#FF0000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_marginTop="135dp" />

Код: ImageView ImageView = (ImageView) findViewById (R.id.imageView);

byte[] imgData = Base64.decode("iVBORw0KGgoAAAANSUhEUgAAAJIAAACSCAMAAACZpWO8AAAC0FBMVEWioqKioqKioqKioqKioqKioqKmpqaurq6urq6tra2urq6urq6lpaWkpKSurq6urq6urq6lpaWurq6urq6urq6urq6lpaWurq6pqamurq6urq6urq6urq6urq6oqKiurq6tra2urq6urq6rq6uurq6mpqaurq6urq6urq6urq6urq6urq6urq6np6eurq6kpKSjo6Opqamurq6urq6urq6urq6urq6urq6urq6ioqKkpKSpqamurq6urq6urq6urq6qqqqurq6urq6urq6srKyurq6mpqaurq6urq6urq6urq6tra2lpaWurq6urq6urq6urq6urq6urq6urq6urq6oqKiurq6oqKiurq6lpaWurq6urq6np6eurq6urq6urq6urq6urq6urq6urq6pqamurq6urq6urq6urq6srKyurq6urq6jo6Ourq6urq6urq6urq6urq6oqKioqKinp6eqqqqnp6eurq6urq6urq6pqamurq6urq6urq6urq6rq6uqqqqkpKSurq6urq6np6eurq6urq6urq6urq6jo6Ourq6urq6urq6urq6lpaWurq6urq6qqqqurq6urq6urq6urq6urq6jo6OkpKSurq6urq6urq6urq6srKympqaurq6urq6rq6uioqKurq6urq6urq6srKyjo6Ourq6urq6kpKSkpKSurq6urq6srKyurq6np6eurq6urq6lpaWurq6urq6urq6urq6mpqampqalpaWurq6pqamurq6urq6urq6urq6kpKSkpKSjo6Ourq6urq6urq6jo6Ourq6urq6urq6urq6np6erq6uurq6urq6mpqaurq6urq6urq6urq6urq6urq6urq6jo6Ourq6urq6urq6urq6urq6urq6urq6urq6qqqqjo6Ourq6jo6MAAACmpqaoqKiqqqqsrKyjo6Otra2np6erq6upqamurq5SThJGAAAA5nRSTlP7/v79/PzQhSihZ1zY5kqVkd6WPYCe3Yy5Y0AvPo3AJ6NEWayH0jgukGA1N4rMMuTyvUF2fW0kNnr54rucg0V3tSkxWKtW10NXXl2i3Ihql1JQkpt/xprBTuFihs4qLA4IFmxfvItmOXSmc2vznZgmeY/CxcmzzY5aYb5LZQob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", Base64.DEFAULT); 
    Bitmap bmp = BitmapFactory.decodeByteArray(imgData, 0, imgData.length); 

    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.PNG, 100, os); 

    byte[] compressedData = os.toByteArray(); 

    Bitmap bPNGCompress = BitmapFactory.decodeByteArray(compressedData, 0, compressedData.length); 

    imageView.setImageBitmap(bPNGCompress);` 
+0

Спасибо за идею, но это не имеет никакого значения ... все еще нет прозрачности. Я пишу тестовое приложение.net, чтобы проверить, потеряется ли прозрачность, когда я добавляю его в db в виде строки, или если проблема в коде, где я использую строку в приложении для Android. Надеюсь, это даст мне представление о том, где искать. – user2329274

+0

Да, это правильно - вы потеряли биты ALPHA (прозрачности). Я протестировал вышеприведенный код, и он работает хорошо (также был обновлен ответ). –

+0

Большое спасибо Маркус! Теперь я знаю, где искать. Как вы создали свою строку изображения, которая также может помочь мне. – user2329274