Android copyPixelsFromBuffer () pro konkrétní bitmapy kompenzovat?

hlasů
3

Já jsem pracoval na Android aplikaci, která se zabývá grafických operací v nativním kódu na sdílené vyrovnávací paměti. Udělal jsem funkce zavolat své nativní kód z Javy pomocí JNI a můj rodný kód používá rozhraní API JNI volat Java z nativního kódu. Vzhledem k tomu, kopírování velkých polí pixelů, má významný vliv na výkon, musím se tomu vyhnout, jak je to jen možné.

Android dokumentace pro Bitmap třídy jednání dvěma způsoby pro kopírování pixelů na Bitmap vnitřní vyrovnávací paměti: http://developer.android.com/reference/android/graphics/Bitmap.html

setPixels (int [] pixelů, int offset, int krok, int x, int y, šířka int, výška int) nahradit pixelů v rastr s barvy v poli.

copyPixelsFromBuffer (Buffer src) Kopírování obrazových bodů z vyrovnávací paměti, počínaje na aktuální pozici, přepsání rastrového obrázku je pixelů.

Problém s dokumentací API je, že je velmi vágní o tom, co se děje v zákulisí, když budete používat tyto funkce. Nicméně, je uvedeno, že někde copyPixelsFromBuffer () zkopíruje pixely přímo bez jakékoliv vnitřní konverzi formátu barvu, na rozdíl od setPixels (), která bude ve všech případech to udělat konverzi, i když původní obrazové body jsou ve formátu cílového pixelu. Je zřejmé, že to není něco, co chci, protože obrazové body v mé paměti, jsou v dobré formátu již.

Nyní copyPixelsFromBuffer () vypadá velmi hezky, protože to nebude dělat, že konverze, ale dokumentace nemluví o tom, jak kopírovat obrazových bodů z vyrovnávací paměti do určitého odsazení v cílové bitmapy. Jejda, to je něco velmi důležité, protože nechci kopírovat celou vyrovnávací paměť pokaždé, ale pouze oblast na něm. Ano, dokumentace říká, že to bude kopírovat z aktuální pozice ve zdrojovém vyrovnávací paměti , ale není nic řečeno o cílové vyrovnávací paměti. SetPixels () dělá zbytečné konverze, ale umožňuje určit posun v cílové vyrovnávací paměti.

Takže, já jsem uvízl mezi:

Kopírování pouze oblast, že chci za cenu nutnosti konverze pixelů

NEBO

Vyhnout konverze pixelů na úkor kopírování celou vyrovnávací paměť pokaždé

Chcete-li získat představu o tom, můžu mít vyrovnávací představující obrazovky 1024x768, s neplatným regionu, který jde od (300,300) na (400,400).

Mám-li zkopírovat pouze oblast musím aktualizovat, mohu kopírovat a převést 100 x 100 pixelů nebo kopírovat bez konverze 1024 * 768 pixelů. 100x100 neplatná oblast je malá a jen zvláštní případ, většina neplatné oblasti by se mnohem větší část vyrovnávací paměti. Obě metody mají velmi negativní vliv na výkon.

Má někdo má představu o tom, jak bych mohl zkopírovat obrazové body z mé paměti na určité odsazení na cílové vyrovnávací paměti, bez vynucených konverzí pixelů? To by bylo to nejlepší z obou světů, a já nevidím důvod, proč se nezdá být k dispozici.

Díky moc za vaši pomoc

Položena 04/11/2010 v 19:33
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Můj odhad je třeba funkci nebere cíl kompenzovat, protože to prostě automaticky použije zdroj posun pro zdroj a cíl. Měl bys to vyzkoušet.

-n

Odpovězeno 05/11/2010 v 17:36
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more