Filme porno

Categorii

Advertising

Alias ​​redimensioneaza gratuit cu RenderScript

Redimensionarea unui bitmap este o sarcina destul de obisnuita. Sa presupunem ca doriti sa creati o miniatura dintr-o imagine sursa; va trebui sa-l redimensionati la o dimensiune destul de mica. Cu toate acestea, daca incercati sa faceti acest lucru folosind instrumentele furnizate, veti ajunge la artefacte de aliasing.

Clasa Bitmap de la Android ofera multe metode care pot redimensiona o imagine. Sub capota, foloseste un obiect Canvas si Paint care are activata filtrarea biliniara. Cu toate acestea, atunci cand reduceti imaginea, filtrarea biliniara nu este suficienta pentru a preveni aliasarea.

In imaginile de mai jos, o imagine cu rezolutie `2880 x 2160` a fost redimensionata la` 360 x 270`. In partea de sus, puteti vedea rezultatul utilizarii metodei BitScap CreateScaledBitmap (), iar in partea de jos puteti vedea un rezultat de redimensionare adecvat. Artefactele de aliasing datorate submasionarii sunt destul de intense in partea de sus si rezultatul este inacceptabil.

Redimensionarea cu artefacte de aliasing

Redimensionare corecta

Atentie : Datorita redimensionarii medii a imaginilor, este posibil ca comparatia de mai sus sa nu fie reprezentata fidel. Va rugam sa vedeti imaginea de sus aici si imaginea de jos aici. Imagine originala aici.

Array

Singura solutie prealabila pentru reducerea scalarii fara aliasing este metodele de decodare BitmapFactory in care trebuie sa oferiti o valoare adecvata dimensiunii esantionului.

De exemplu, urmatorul cod creeaza o imagine cu dimensiunea 1/8 fata de original:

Optiuni BitmapFactory.Options = new BitmapFactory.Options ();

options.inSampleSize = 8;

Bitmap bitmap = BitmapFactory.decodeFile (imageFile.getAbsolutePath (), optiuni);

O problema majora cu aceasta abordare este ca, daca bitmap-ul dvs. este deja decodificat, nu puteti utiliza aceasta metoda. De asemenea, dimensiunea esantionului poate utiliza numai valori care au puteri de 2. Acest lucru inseamna ca nu puteti reduce la o rezolutie arbitrara, ci doar la jumatatile rezolutiei originale. Nu in ultimul rand, aceasta metoda functioneaza excelent cu fisierele JPEG, dar daca imaginea decodificata este de tip PNG, ajungeti la aliasing.

O solutie pentru a gestiona reducerea redimensionarii la o dimensiune arbitrara ar fi sa decodificati mai intai imaginea la urmatoarea putere de rezolutie 2 si apoi sa utilizati metodele Bitmap pentru a o redimensiona exact la dimensiunea dorita. Cu toate acestea, rezultatul va fi usor neclar. Actualizare : In loc sa utilizati metodele Bitmap pentru a reduce imaginea la dimensiuni arbitrare dupa metoda de decodare, puteti obtine acelasi rezultat vizual din cadrul metodei de decodificare, specificand, de asemenea, inDensity si inTargetDensity, asa cum este explicat in acest videoclip.

O solutie la reducerea redimensionarii de inalta calitate la puteri de 2 dimensiuni atunci cand bitmap-ul este deja decodificat (si nu putem folosi metodele de decodare a BitmapFactory) este redimensionarea succesiva a bitmap-ului la jumatate de dimensiuni. Puteti vedea doua implementari in acest esential. Retineti ca, daca trebuie sa reduceti dimensiunea la o dimensiune arbitrara, este necesara inca o trecere de redimensionare pentru a trece de la urmatoarele dimensiuni de putere mai mare de 2 la dimensiunile dorite. Dupa cum sa mentionat anterior, acest lucru produce un rezultat putin neclar.

Asa cum se explica in toate cartile de procesare a semnalului, pentru a submostra un semnal si a evita aliasarea, trebuie mai intai sa prefiltrati semnalul pentru a exclude frecventele inalte. Apoi, il puteti submostra.

Cu alte cuvinte, trebuie mai intai sa „estompam” imaginea si apoi sa o submostram. Cantitatea de neclaritate pe care trebuie sa o aplicam depinde de metoda de prefiltrare si de cat de mult trebuie sa submustram imaginea (vezi: Frecventa Nyquist).

Unul dintre cele mai rapide moduri de a estompa o imagine in Android este utilizarea RenderScript. Din fericire, RenderScript vine la pachet cu o implementare de filtru Gaussian, ScriptIntrinsicBlur, care poate aplica prefiltrarea pentru noi. De asemenea, ofera un caracter intrinsec pentru redimensionare, ScriptIntrinsicResize, care utilizeaza interpolare bicubica.

Deci, ideea este ca vom aplica mai intai neclaritatea Gauss la imagine si apoi o vom submostra folosind interpolare bicubica.

Poate ca cea mai dificila parte a codului este calcularea razei lui Gauss. La inceput, calculez sigma lui Gauss in raport cu raportul de subesantionare ca: resizeRatio / p. Acest lucru este derivat de faptul ca raspunsul de frecventa al unui Gauss este un alt Gauss si un pic de matematica. ScriptIntrinsicBlur are totusi un parametru de raza, nu un sigma. Dar codul sursa al Google arata relatia dintre cele doua: sigma = raza * 0,4 + 0,6. Rezolvarea pentru raza ne ofera: raza plutitoare = 2,5f * sigma -1,5f ;.

Restul codului se explica de la sine. Cream alocari pentru imaginea sursa, imaginea neclara si imaginea de iesire. Mai intai aplicam neclaritatea Gaussiana si apoi o redimensionam. De asemenea, facem un pic de gestionare a memoriei.

Performanta si comparatie

Am incercat metoda propusa pentru a redimensiona o imagine de 2880×2160 la 640×480. De asemenea, am incercat metoda Bitmap.createScaledBitmap (), metoda de redimensionare succesiva (folosind mai multe apeluri Bitmap.createScaledBitmap ()) si metoda de redimensionare succesiva folosind interpolare bicubica a RenderScript. Iata rezultatele:

createScaledBitmap: 14ms [image]

resizes succesive: 63ms [image]

resizes succesive (RenderScript): 45ms [image]

Metoda propusa: 177 ms [image]

Metoda „ createScaledBitmap” , chiar daca este cea mai rapida, are aliasing extrem. „ Redimensionarea succesiva” este putin neclara si „ redimensionarea succesiva (RenderScript) ” este putin mai clara. „Metoda propusa” are de departe cea mai buna calitate.

Daca redimensionam imaginea la dimensiunea puterii de 2 de 360×270, avem urmatoarele rezultate:

createScaledBitmap: 4ms [imagine]

redimensionari succesive: 46ms [imagine]

redimensionari succesive (RenderScript): 34ms [imagine]

metoda propusa: 121 ms [imagine]

Deoarece reducem cu o putere de 2, rezultatele sunt putin diferite din punct de vedere calitativ. Metoda „ redimensionarii succesive” da rezultate identice metodei propuse datorita faptului ca nu este necesara nicio redimensionare. Cele succesive redimensioneaza (RenderScript) “este un pic mai clar ca de obicei.

Metoda propusa dureaza 380 ms pentru a scala o imagine 5760×4320 la 640×480 .

Toate experimentele au functionat pe un Nexus 5.

Cateva remarci

Retineti ca, daca resizeRatio este mai mare de 1 , atunci suntem de fapt upscaling si prefiltrarea cu filtru Gauss nu este necesara.

Filtrul Gaussian nu este cea mai buna metoda de prefiltrare, dar motivul pentru care a fost ales aici se datoreaza faptului ca RenderScript contine un instrument intrinsec gata de utilizare. In mod ideal, am putea folosi un filtru de medie, dar acest lucru ar necesita scrierea propriului nostru nucleu RenderScript.

Aplicarea unui neclaritate gaussiana la o imagine mare este solicitanta. De asemenea, cu cat resizeRatio este mai mare, cu atat raza Gaussian devine mai mare si astfel procesarea devine mai costisitoare din punct de vedere al calculului. Ceea ce am putea face pentru a imbunatati performanta este sa folosim metoda de decodare a BitmapFactory pentru a submostra imaginea si apoi a aplica acest algoritm imaginii rezultate. De exemplu, daca imaginea sursa are o latime de 5760 si latimea tinta este 640 , raportul este de 9 . Am putea decoda imaginea folosind options.inSampleSize = 2 si apoi sa aplicam algoritmul pentru imaginea decodificata (jumatate) folosind resizeRation = resizeRatio / options.inSampleSize, care in cazul nostru este: 9/2 = 4.5 .

Daca sunteti interesat sa acceptati dispozitive mai vechi, puteti utiliza RenderScript prin intermediul Bibliotecii de asistenta V8. In testele mele, biblioteca de asistenta a avut o performanta mai buna decat timpul de executie nativ RenderScript!

Aceasta postare a fost initial postata pe blogul Horizon.

Video Description:

Redimensionarea unui bitmap este o sarcina destul de obisnuita. Sa presupunem ca doriti sa creati o miniatura dintr-o imagine sursa; va trebui sa-l redimensionati la o dimensiune destul de mica. Cu toate acestea, daca incercati sa faceti acest lucru folosind instrumentele furnizate, veti ajunge la artefacte de aliasing.Clasa Bitmap de la Android ofera multe metode care pot redimensiona o imagine. Sub capota, foloseste un obiect Canvas si Paint care are activata filtrarea biliniara. Cu toate acestea, atunci cand reduceti imaginea, filtrarea biliniara nu este suficienta pentru a preveni aliasarea.In imaginile de mai jos, o imagine cu rezolutie `2880 x 2160` a fost redimensionata la` 360 x 270`. In partea de sus, puteti vedea rezultatul utilizarii metodei BitScap CreateScaledBitmap (), iar in partea de jos puteti vedea un rezultat de redimensionare adecvat. Artefactele de aliasing datorate submasionarii sunt destul de intense in partea de sus si rezultatul este inacceptabil.Redimensionarea cu artefacte de aliasingRedimensionare corectaAtentie : Datorita redimensionarii medii a imaginilor, este posibil ca comparatia de mai sus sa nu fie reprezentata fidel. Va rugam sa vedeti imaginea de sus aici si imaginea de jos aici. Imagine originala aici. Array Singura solutie prealabila pentru reducerea scalarii fara aliasing este metodele de decodare BitmapFactory in care trebuie sa oferiti o valoare adecvata dimensiunii esantionului.De exemplu, urmatorul cod creeaza o imagine cu dimensiunea 1/8 fata de original:Optiuni BitmapFactory.Options = new BitmapFactory.Options (); options.inSampleSize = 8; Bitmap bitmap = BitmapFactory.decodeFile (imageFile.getAbsolutePath (), optiuni);O problema majora cu aceasta abordare este ca, daca bitmap-ul dvs. este deja decodificat, nu puteti utiliza aceasta metoda. De asemenea, dimensiunea esantionului poate utiliza numai valori care au puteri de 2. Acest lucru inseamna ca nu puteti reduce la o rezolutie arbitrara, ci doar la jumatatile rezolutiei originale. Nu in ultimul rand, aceasta metoda functioneaza excelent cu fisierele JPEG, dar daca imaginea decodificata este de tip PNG, ajungeti la aliasing. porno avec scenario www.msiinsurancegroup.biz porno casero www.smacomber.com liza del sierra porno peoplesofthosting.us porno crade testmasters.info jeune francaise porno jamproductions.info position porno erccorp.net ici porno yorioliviahonablue.org porno vieux gay nationalworkwear.us porno père et fille laagnasalong.corporatebrandsolutions.com porno fornite manabi.fortruth.com afida turner porno edepressed.com jessica alba porno price-whitson.com porno italia dustyroadsunlimited.com porno sado eichenbaum.com porno coq nu teamsterslocal120.com agde porno www.avectraacrp.com porno family soonerweekly.com porno bourgeoise www.lazypirate.com porno pub nagarathar.com porno pussy polaroidone.info O solutie pentru a gestiona reducerea redimensionarii la o dimensiune arbitrara ar fi sa decodificati mai intai imaginea la urmatoarea putere de rezolutie 2 si apoi sa utilizati metodele Bitmap pentru a o redimensiona exact la dimensiunea dorita. Cu toate acestea, rezultatul va fi usor neclar. Actualizare : In loc sa utilizati metodele Bitmap pentru a reduce imaginea la dimensiuni arbitrare dupa metoda de decodare, puteti obtine acelasi rezultat vizual din cadrul metodei de decodificare, specificand, de asemenea, inDensity si inTargetDensity, asa cum este explicat in acest videoclip.O solutie la reducerea redimensionarii de inalta calitate la puteri de 2 dimensiuni atunci cand bitmap-ul este deja decodificat (si nu putem folosi metodele de decodare a BitmapFactory) este redimensionarea succesiva a bitmap-ului la jumatate de dimensiuni. Puteti vedea doua implementari in acest esential. Retineti ca, daca trebuie sa reduceti dimensiunea la o dimensiune arbitrara, este necesara inca o trecere de redimensionare pentru a trece de la urmatoarele dimensiuni de putere mai mare de 2 la dimensiunile dorite. Dupa cum sa mentionat anterior, acest lucru produce un rezultat putin neclar.Asa cum se explica in toate cartile de procesare a semnalului, pentru a submostra un semnal si a evita aliasarea, trebuie mai intai sa prefiltrati semnalul pentru a exclude frecventele inalte. Apoi, il puteti submostra.Cu alte cuvinte, trebuie mai intai sa „estompam” imaginea si apoi sa o submostram. Cantitatea de neclaritate pe care trebuie sa o aplicam depinde de metoda de prefiltrare si de cat de mult trebuie sa submustram imaginea (vezi: Frecventa Nyquist).Unul dintre cele mai rapide moduri de a estompa o imagine in Android este utilizarea RenderScript. Din fericire, RenderScript vine la pachet cu o implementare de filtru Gaussian, ScriptIntrinsicBlur, care poate aplica prefiltrarea pentru noi. De asemenea, ofera un caracter intrinsec pentru redimensionare, ScriptIntrinsicResize, care utilizeaza interpolare bicubica.Deci, ideea este ca vom aplica mai intai neclaritatea Gauss la imagine si apoi o vom submostra folosind interpolare bicubica.Poate ca cea mai dificila parte a codului este calcularea razei lui Gauss. La inceput, calculez sigma lui Gauss in raport cu raportul de subesantionare ca: resizeRatio / p. Acest lucru este derivat de faptul ca raspunsul de frecventa al unui Gauss este un alt Gauss si un pic de matematica. ScriptIntrinsicBlur are totusi un parametru de raza, nu un sigma. Dar codul sursa al Google arata relatia dintre cele doua: sigma = raza * 0,4 + 0,6. Rezolvarea pentru raza ne ofera: raza plutitoare = 2,5f * sigma -1,5f ;.Restul codului se explica de la sine. Cream alocari pentru imaginea sursa, imaginea neclara si imaginea de iesire. Mai intai aplicam neclaritatea Gaussiana si apoi o redimensionam. De asemenea, facem un pic de gestionare a memoriei.Performanta si comparatieAm incercat metoda propusa pentru a redimensiona o imagine de 2880x2160 la 640x480. De asemenea, am incercat metoda Bitmap.createScaledBitmap (), metoda de redimensionare succesiva (folosind mai multe apeluri Bitmap.createScaledBitmap ()) si metoda de redimensionare succesiva folosind interpolare bicubica a RenderScript. Iata rezultatele:createScaledBitmap: 14ms [image] resizes succesive: 63ms [image] resizes succesive (RenderScript): 45ms [image] Metoda propusa: 177 ms [image]Metoda „ createScaledBitmap” , chiar daca este cea mai rapida, are aliasing extrem. „ Redimensionarea succesiva” este putin neclara si „ redimensionarea succesiva (RenderScript) ” este putin mai clara. „Metoda propusa” are de departe cea mai buna calitate.Daca redimensionam imaginea la dimensiunea puterii de 2 de 360x270, avem urmatoarele rezultate:createScaledBitmap: 4ms [imagine] redimensionari succesive: 46ms [imagine] redimensionari succesive (RenderScript): 34ms [imagine] metoda propusa: 121 ms [imagine]Deoarece reducem cu o putere de 2, rezultatele sunt putin diferite din punct de vedere calitativ. Metoda „ redimensionarii succesive” da rezultate identice metodei propuse datorita faptului ca nu este necesara nicio redimensionare. Cele succesive redimensioneaza (RenderScript) “este un pic mai clar ca de obicei.Metoda propusa dureaza 380 ms pentru a scala o imagine 5760x4320 la 640x480 .Toate experimentele au functionat pe un Nexus 5.Cateva remarciRetineti ca, daca resizeRatio este mai mare de 1 , atunci suntem de fapt upscaling si prefiltrarea cu filtru Gauss nu este necesara.Filtrul Gaussian nu este cea mai buna metoda de prefiltrare, dar motivul pentru care a fost ales aici se datoreaza faptului ca RenderScript contine un instrument intrinsec gata de utilizare. In mod ideal, am putea folosi un filtru de medie, dar acest lucru ar necesita scrierea propriului nostru nucleu RenderScript.Aplicarea unui neclaritate gaussiana la o imagine mare este solicitanta. De asemenea, cu cat resizeRatio este mai mare, cu atat raza Gaussian devine mai mare si astfel procesarea devine mai costisitoare din punct de vedere al calculului. Ceea ce am putea face pentru a imbunatati performanta este sa folosim metoda de decodare a BitmapFactory pentru a submostra imaginea si apoi a aplica acest algoritm imaginii rezultate. De exemplu, daca imaginea sursa are o latime de 5760 si latimea tinta este 640 , raportul este de 9 . Am putea decoda imaginea folosind options.inSampleSize = 2 si apoi sa aplicam algoritmul pentru imaginea decodificata (jumatate) folosind resizeRation = resizeRatio / options.inSampleSize, care in cazul nostru este: 9/2 = 4.5 .Daca sunteti interesat sa acceptati dispozitive mai vechi, puteti utiliza RenderScript prin intermediul Bibliotecii de asistenta V8. In testele mele, biblioteca de asistenta a avut o performanta mai buna decat timpul de executie nativ RenderScript!Aceasta postare a fost initial postata pe blogul Horizon.

Categorie:
Taguri:
Data adaugarii: