Intereting Posts
Android с открытым исходным кодом игры + учебники Android webView: возможно установить клавиатуру чисел по умолчанию при использовании типа ввода = текст Как установить активный элемент в раскрывающемся меню «Панель действий»? Кнопка Android Use Done на клавиатуре для нажатия кнопки Использовать firefox как средство рендеринга для веб-просмотра Android IntelliJ / структурный поиск: удаление бесполезных методов, которые вызывают только метод super Как включить ведение журнала для apache commons HttpClient на Android Адресная строка браузера веб-браузера (хром) изменяет значение $ (window) .height (); Создание фонового размера: масштабирование обложки каждый раз Как использовать намерение выбора файлового браузера для выбора файла SimpleDateFormat возвращает 24-часовую дату: как получить 12-часовую дату? Явное намерение Android с целевым компонентом Webview избегает предупреждения безопасности из игры Google при реализации onReceivedSslError Панель инструментов AppCompat v7 Up / Back Arrow не работает Android – Как узнать, накладывает ли вид наложение другого вида в RelativeLayout Просмотр списка с группами в android

Сжатие изображения камеры перед загрузкой

Я использую этот код (от www.internetria.com ), чтобы сделать фотографию и загрузить на сервер:

OnCreate:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri output = Uri.fromFile(new File(foto)); intent.putExtra(MediaStore.EXTRA_OUTPUT, output); startActivityForResult(intent, TAKE_PICTURE); 

onActivityResult:

 ImageView iv = (ImageView) findViewById(R.id.imageView1); iv.setImageBitmap(BitmapFactory.decodeFile(foto)); File file = new File(foto); if (file.exists()) { UploaderFoto nuevaTarea = new UploaderFoto(); nuevaTarea.execute(foto); } else Toast.makeText(getApplicationContext(), "No se ha realizado la foto", Toast.LENGTH_SHORT).show(); 

UploaderFoto:

 ProgressDialog pDialog; String miFoto = ""; @Override protected Void doInBackground(String... params) { miFoto = params[0]; try { HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpPost httppost = new HttpPost("http://servidor.com/up.php"); File file = new File(miFoto); MultipartEntity mpEntity = new MultipartEntity(); ContentBody foto = new FileBody(file, "image/jpeg"); mpEntity.addPart("fotoUp", foto); httppost.setEntity(mpEntity); httpclient.execute(httppost); httpclient.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } return null; } 

И я хочу сжать изображение, потому что размер слишком велик.

Я не знаю, как добавить bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); К моему приложению

Solutions Collecting From Web of "Сжатие изображения камеры перед загрузкой"

Взгляните сюда: ByteArrayOutputStream в FileBody

Что-то в этом направлении должно работать:

замещать

 File file = new File(miFoto); ContentBody foto = new FileBody(file, "image/jpeg"); 

с

 Bitmap bmp = BitmapFactory.decodeFile(miFoto) ByteArrayOutputStream bos = new ByteArrayOutputStream(); bmp.compress(CompressFormat.JPEG, 70, bos); InputStream in = new ByteArrayInputStream(bos.toByteArray()); ContentBody foto = new InputStreamBody(in, "image/jpeg", "filename"); 

Если размер файла по-прежнему является проблемой, вы можете захотеть масштабировать изображение в дополнение к его сжатию.

Конвертируйте изображение в формат Google WebP, он сэкономит вам много байтов в следующих двух статьях, которые вы также можете преобразовать webP в JPG / PNG / GIF, что бы вы ни пожелали на стороне сервера.

Java Wrapper API Google WebP

Как проверить библиотеку Google WebP и использовать ее в Android в качестве родной библиотеки

Во-первых, вам нужно получить пиксели из растрового изображения.

 Bitmap bitmap = BitmapFactory.decodeFile(filePath); int bytes = bitmap.getByteCount(); ByteBuffer buffer = ByteBuffer.allocate(bytes); bitmap.copyPixelsToBuffer(buffer); byte[] pixels = buffer.array(); 

Затем вы можете получить массив байтов WebP.

 int stride = bytes / height; int quality = 100; byte[] encoded = libwebp.WebPEncodeRGBA(pixels, width, height, stride, quality); 

Test.png (Размер: 106 КБ) Test.png (Размер: 106 КБ) Test.webp (размер: 48 КБ) Test.webp (размер: 48 КБ)

Используя okhttp, я загружу вот так:

 MediaType MEDIA_TYPE_PNG = MediaType.parse("image/jpeg"); //Compress Image Bitmap bmp = BitmapFactory.decodeFile(fileToUpload.getAbsolutePath()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 70, bos); RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addFormDataPart("photo", fileToUpload.getName(), RequestBody.create(MEDIA_TYPE_PNG, bos.toByteArray())) .build(); request = new Request.Builder() .url(urlToUploadTo) .post(requestBody) .build(); try { response = client.newCall(request).execute(); if (response != null) { if (response.isSuccessful()) { responseResult = response.body().string(); } } } catch (IOException e) { e.printStackTrace(); } 

Посмотрите на метод compressImage() :

 public class MainActivity extends Activity { private Uri fileUri; private ImageView img_forCompress; public static final int MEDIA_TYPE_IMAGE = 1; private static final int CAMERA_REQUEST = 1888; private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100; private static final String IMAGE_DIRECTORY_NAME = "Ibook"; static File mediaFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img_forCompress = (ImageView) findViewById(R.id.img_forCompress); img_forCompress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // start the image capture Intent startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); } }); } public Uri getOutputMediaFileUri(int type) { return Uri.fromFile(getOutputMediaFile(type)); } private static File getOutputMediaFile(int type) { // External sdcard location File mediaStorageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME); // Create the storage directory if it does not exist if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " + IMAGE_DIRECTORY_NAME + " directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); if (type == MEDIA_TYPE_IMAGE) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); } else { return null; } Log.e("path", "media file:-" + mediaFile); return mediaFile; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); Log.e("path", "" + mediaFile.toString()); String filename = mediaFile.toString(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap bitmap = BitmapFactory.decodeFile(filename, options); compressImage(bitmap); } private void compressImage(Bitmap photo) { // TODO Auto-generated method stub int imageWidth = photo.getWidth(); int imageHeight = photo.getHeight(); long length = mediaFile.length(); int newHeight = 0; int newWidth = 0; Toast.makeText(MainActivity.this, "oldwidth="+imageWidth+",oldHeight="+imageHeight,Toast.LENGTH_LONG).show(); Log.e("Old Image gheight and width---------", imageWidth + "-------" + imageHeight + " and Size is -- " + length); if (imageHeight > 1500 || imageWidth > 1500) { if (imageHeight > imageWidth) { Log.e("height is more", "true"); newHeight = 1200; newWidth = (newHeight * imageWidth / imageHeight); } if (imageWidth > imageHeight) { Log.e("width is more", "true"); newWidth = 1200; newHeight = (newWidth * imageHeight / imageWidth); } } Toast.makeText(MainActivity.this, "newwidth="+newWidth+",newHeight="+newHeight,Toast.LENGTH_LONG).show(); Log.e("new Image gheight and width---------", newHeight + "-------"