getNinePatchChunk
работает просто отлично.Он вернул null, потому что вы давали Bitmap
«исходный» девять патчей.Для этого требуется «скомпилированное» изображение ninepatch.
В мире Android существует два типа форматов файлов ninepatch («исходный» и «скомпилированный»).В исходной версии вы добавляете границу прозрачности 1px везде - когда вы позже компилируете свое приложение в .apk, aapt преобразует ваши файлы * .9.png в двоичный формат, который ожидает Android.Здесь файл png получает метаданные «чанка».( читать дальше )
Хорошо, теперь приступим к делу (вы слушаете DJ kanzure).
Код клиента, что-то вроде этого:
InputStream stream = .. //whatever
Bitmap bitmap = BitmapFactory.decodeStream(stream);
byte[] chunk = bitmap.getNinePatchChunk();
boolean result = NinePatch.isNinePatchChunk(chunk);
NinePatchDrawable patchy = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
На стороне сервера, вам нужно подготовить ваши изображения.Вы можете использовать Компилятор двоичных ресурсов Android .Это автоматизирует некоторые трудности, связанные с созданием нового проекта Android, просто для компиляции некоторых файлов * .9.png в собственный формат Android.Если бы вы делали это вручную, вы бы по сути сделали проект и добавили несколько файлов * .9.png («исходные» файлы), скомпилировали все в формат .apk, разархивировали файл .apk, а затем нашли *.Файл 9.png, и это тот, который вы отправляете своим клиентам.
Также: я не знаю, знает ли BitmapFactory.decodeStream
о npTc чанке в этих файлах png, поэтомуможет или не может обрабатывать поток изображения правильно.Существование Bitmap.getNinePatchChunk
предполагает, что BitmapFactory
может - вы можете посмотреть его в исходной кодовой базе.
В случае, если он не знает о чанке npTc и ваши изображения испорченызначительно, тогда мой ответ немного меняется.
Вместо того, чтобы отправлять скомпилированные образы из девяти патчей клиенту, вы пишете быстрое приложение для Android, чтобы загружать скомпилированные образы и выплевывать кусок byte[]
.Затем вы передаете этот байтовый массив своим клиентам вместе с обычным изображением - без прозрачных границ, без «исходного» изображения NinePatch, а не скомпилированного Ninpatch-изображения.Вы можете напрямую использовать чанк для создания своего объекта.
Другой альтернативой является использование сериализации объектов для отправки изображений из девяти патчей (NinePatch
) вашим клиентам, например, с помощью JSON или встроенного сериализатора.
Редактировать Если вам действительно нужно создать свой собственный массив байтов, я бы начал с просмотра do_9patch
, isNinePatchChunk
, Res_png_9patch
и Res_png_9patch::serialize()
в ResourceTypes.cpp.,Также есть самодельный npTc чанк ридер от Дмитрия Скиба.Я не могу публиковать ссылки, поэтому, если кто-то сможет отредактировать мой ответ, это будет здорово.
do_9patch: https://android.googlesource.com/platform/frameworks/base/+/gingerbread/tools/aapt/Images.cpp
isNinePatchChunk: http://netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android/graphics/NinePatch.cpp
struct Res_png_9patch:https://scm.sipfoundry.org/rep/sipX/main/sipXmediaLib/contrib/android/android_2_0_headers/frameworks/base/include/utils/ResourceTypes.h
Дмитрий Скиба материал: http://code.google.com/p/android4me/source/browse/src/android/graphics/Bitmap.java