BitmapFactory.dekodowanie z pamięci z obrazami 2400x2400
Muszę wysłać obraz z pliku na serwer. Serwer żąda obrazu w rozdzielczości 2400x2400.
To co próbuję zrobić to:
1) Uzyskaj bitmapę za pomocą BitmapFactory.dekodowanie za pomocą poprawnego inSampleSize.
2) Kompresuj obraz w FORMACIE JPEG z jakością 40%
3) Zakoduj obraz w base64
4) wysłany na Serwer
Nie mogę osiągnąć pierwszego kroku, wyrzuca wyjątek z pamięci. Jestem pewien, że inSampleSize jest zgadza się, ale przypuszczam, że nawet z inSampleSize Bitmap jest ogromna (około 30 MB w DDMS).
Jakieś pomysły jak to zrobić? Czy mogę wykonać te kroki bez utworzenia obiektu bitmapowego? Mam na myśli robienie tego na systemie plików zamiast pamięci RAM.To jest obecny kod:
// The following function calculate the correct inSampleSize
Bitmap image = Util.decodeSampledBitmapFromFile(imagePath, width,height);
// compressing the image
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 40, baos);
// encode image
String encodedImage = Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT));
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromFile(String path,int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path,options);
}
3 answers
Możesz pominąć ARGB_8888 i zamiast tego użyć RGB_565, a następnie ditherować obrazy, aby zachować dobrą jakość
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
options.inDither = true;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 07:45:46
Musisz użyć BitmapFactory.Options
z inJustDecodeBounds
ustawionym na true. W ten sposób można wczytać informacje o bitmapie i obliczyć wartość dla downsamplingu (na przykładinSampleSize
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-30 09:43:36
Nie ładuj obrazu jako bitmapy, nie Konwertuj go na tablicę, a następnie wyślij.
Zamiast:
Odczytaj jako plik, w formacie JPG. Użyj tablicy bajtów plików, aby ją zakodować i wysłać plik w poprzek.
Załadowanie go do bitmapy spowoduje niepotrzebne problemy z pamięcią. Obraz w formacie Bitmapowym zajmie ~20x lub więcej pamięci niż potrzeba.
Po stronie serwera, będziesz musiał traktować go jako plik. zamiast bitmapy.
Oto link do wczytywania pliku do bajtu []: elegancki sposób odczytu pliku do bajtu [] tablica w Javie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26