Pracuję nad funkcją pobierania obrazu z serwera WWW, wyświetlania go na ekranie, a jeśli użytkownik chce zachować obraz, zapisz go na karcie SD w określonym folderze. Czy istnieje prosty sposób na zrobienie mapy bitowej i zapisanie jej na karcie SD w wybranym folderze?
Mój problem polega na tym, że mogę pobrać obraz i wyświetlić go na ekranie jako mapę bitową. Jedynym sposobem, w jaki udało mi się znaleźć obraz do określonego folderu, jest użycie FileOutputStream, ale wymaga to tablicy bajtów. Nie jestem pewien, jak przekonwertować (jeśli jest to właściwy sposób) z tablicy bitmapowej na tablicę bajtów, więc mogę użyć FileOutputStream do zapisania danych.
Inną opcją, którą mam, jest użycie MediaStore:
MediaStore.Images.Media.insertImage(getContentResolver(), bm,
barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
Które działa dobrze, aby zapisać na karcie SD, ale nie pozwala na dostosowanie folderu.
mImage.setImageBitmap(_result.getBitmap());
mojegoonTaskComplete()
wywołania zwrotnego. Teraz muszę zezwolić użytkownikom na zapisywanie pliku lokalnie, jeśli chcą, za pomocą menu kontekstowego długie naciśnięcie. Powinienem móc skorzystać z poniższego rozwiązania. Co chcę wiedzieć, czy odkryłeś lepsze podejście do tego?Odpowiedzi:
źródło
90
w powyższym przykładzie nie będzie miała żadnego wpływu podczas zapisywania w formacie PNG, ale zmieni różnicę w plikach JPEG. W przypadku JPEG możesz wybrać dowolną liczbę od 0 do 100.Powinieneś użyć tej
Bitmap.compress()
metody, aby zapisać bitmapę jako plik. Skompresuje (jeśli pozwala na to format) twój obraz i wrzuci go do OutputStream.Oto przykład instancji Bitmapy uzyskanej dzięki temu,
getImageBitmap(myurl)
która może być skompresowana jako JPEG ze stopniem kompresji 85%:źródło
fOut.flush()
nie można go pominąć?Bitmap.compress
określa jakość.getImageBitmap(myurl)
zgłasza wyjątek bez pozwolenia w AndroidManifest.xml (przynajmniej w os2.2):
źródło
Wewnątrz
onActivityResult
:źródło
Niektóre formaty, takie jak PNG, który jest bezstratny, zignorują ustawienie jakości.
źródło
Oto przykładowy kod do zapisywania bitmapy do pliku:
Teraz wywołaj tę funkcję, aby zapisać mapę bitową w pamięci wewnętrznej.
File newfile = savebitmap(bitmap)
;Mam nadzieję, że ci to pomoże. Szczęśliwego życia kodowania.
źródło
źródło
Dlaczego nie wywołać
Bitmap.compress
metody 100 (która brzmi, jakby była bezstratna)?źródło
Chciałbym również zapisać zdjęcie. Ale moim problemem (?) Jest to, że chcę go zapisać przed bitmapą, którą narysowałem.
Zrobiłem to tak:
źródło
Sposób, w jaki znalazłem, aby wysłać PNG i przezroczystość.
źródło
Utwórz miniaturę wideo dla wideo. Może zwrócić wartość null, jeśli wideo jest uszkodzone lub format nie jest obsługiwany.
Aby zapisać bitmapę w sdcard, użyj następującego kodu
Przechowuj obraz
Aby uzyskać ścieżkę do przechowywania obrazów
źródło
Chcesz zapisać bitmapę w wybranym katalogu. Stworzyłem bibliotekę ImageWorker, która umożliwia użytkownikowi ładowanie, zapisywanie i konwersję obrazów bitmap / drawables / base64.
Min. Zestaw SDK - 14
Warunek wstępny
Zapisywanie bitmapy / Drawable / Base64
Ładowanie mapy bitowej
Realizacja
Dodaj zależności
W gradacji poziomu projektu
W gradacji poziomu aplikacji
Możesz przeczytać więcej na https://github.com/ihimanshurawat/ImageWorker/blob/master/README.md
źródło
Hej, po prostu podaj nazwę .bmp
Zrób to:
będzie to brzmiało, że IM JUŻ WIDZISZ WOKÓŁ, ale spróbuj, gdy zostanie zapisany w bmp foramt..Cheers
źródło
Upewnij się, że katalog został utworzony, zanim zadzwonisz
bitmap.compress
:źródło
Po Androidzie 4.4 Kitkat, a od 2017 roku udział Androida 4.4 i mniej wynosi około 20% i maleje, nie można zapisywać na karcie SD za pomocą
File
klasy igetExternalStorageDirectory()
metody. Ta metoda zwraca pamięć wewnętrzną urządzenia i zapisywane obrazy widoczne dla każdej aplikacji. Możesz także zapisywać obrazy tylko prywatne w swojej aplikacji i zostać usunięte, gdy użytkownik usunie Twoją aplikację za pomocąopenFileOutput()
metodą.Począwszy od systemu Android 6.0, możesz sformatować kartę SD jako pamięć wewnętrzną, ale tylko prywatną dla swojego urządzenia. (Jeśli sformatujesz samochód SD jako pamięć wewnętrzną, tylko twoje urządzenie będzie miało dostęp lub zobaczy jego zawartość) Możesz zapisać na tej karcie SD za pomocą inne odpowiedzi, ale jeśli chcesz użyć wymiennej karty SD, przeczytaj moją odpowiedź poniżej.
Powinieneś użyć Storage Access Framework, aby uzyskać
onActivityResult
metodę działania uri do folderu , aby uzyskać folder wybrany przez użytkownika, i dodać trwałe, trwałe uprawnienia, aby móc uzyskać dostęp do folderu po ponownym uruchomieniu urządzenia.Teraz zapisz folder zapisu we wspólnych preferencjach, aby nie prosić użytkownika o wybranie folderu za każdym razem, gdy chcesz zapisać obraz.
Powinieneś użyć
DocumentFile
klasy, aby zapisać obraz, a nie,File
lubParcelFileDescriptor
, aby uzyskać więcej informacji, możesz sprawdzić ten wątek, aby zapisać obraz na karcie SD za pomocącompress(CompressFormat.JPEG, 100, out);
metody iDocumentFile
klas.źródło
upewnij się, że dodałeś poniżej uprawnienia
oraz w AndroidManifest pod
następnie po prostu wywołaj saveBitmapFile (passYourBitmapHere)
gdzie
i inne metody
i
źródło
error handling for PIE devices..
i myślę, że rekurencjagetOutputMediaFile
może być nieskończoną pętlą, jeśli obejście się nie powiedzie.Zapisz mapę bitową w swojej galerii bez kompresji.
źródło
// | == | Utwórz plik PNG z mapy bitowej:
// | == | Pobierz Bimap z pliku:
źródło