图像压缩像Whatsapp和Android上的其他信使 [英] Image compression like Whatsapp and other messengers on Android

查看:126
本文介绍了图像压缩像Whatsapp和Android上的其他信使的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下代码进行图片压缩。

I am using the following code for image compression.

该代码会压缩大于2 MB的图片文件。

The code compresses image files that are larger than 2 MB.

但这段代码需要时间,并且图像质量保持纯净。

But this code takes time and image quality stays pure.

public static String compressImage(String imagePath, Context context)
    {
        String resizeImagePath = null;
        String filePath = imagePath;
        CustomLogHandler.printDebug(TAG, "resizeImagePath:" + imagePath);
        Bitmap scaledBitmap = null;
        int imageScal = 1;

        // File size greater then 2mb
        DecimalFormat df = new DecimalFormat("0.00");
        File imgFile = new File(filePath);
        double bytes = imgFile.length();
        double kilobytes = (bytes / 1024);
        double megabytes = (kilobytes / 1024);

        AppConfig.makeLog(TAG, "image size in mb:" + df.format(megabytes), 0);

        double filesize = Double.parseDouble(df.format(megabytes));
        if (filesize > 2.00f)
        {

            for (int i = 0; i < filesize; i = i + 2)
            {

                imageScal++;
            }
            int remind = imageScal / 2;
            if (remind != 0)
            {
                imageScal = imageScal + 1;
            }

            makeLog(TAG, "image scale:" + imageScal, 0);

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

            int actualHeight = options.outHeight;
            int actualWidth = options.outWidth;
            float maxHeight = 4000;
            float maxWidth = 6000;
            // float imgRatio = actualWidth / actualHeight;
            // float maxRatio = maxWidth / maxHeight;

            if (actualHeight > maxHeight)
            {
                imageScal = imageScal + 4;
            }

            if (actualWidth > maxWidth)
            {
                imageScal = imageScal + 8;
            }

            // if (actualHeight > maxHeight || actualWidth > maxWidth)
            // {
            // if (imgRatio < maxRatio)
            // {
            // imgRatio = maxHeight / actualHeight;
            // actualWidth = (int) (imgRatio * actualWidth);
            // actualHeight = (int) maxHeight;
            //
            // }
            // else if (imgRatio > maxRatio)
            // {
            // imgRatio = maxWidth / actualWidth;
            // actualHeight = (int) (imgRatio * actualHeight);
            // actualWidth = (int) maxWidth;
            // }
            // else
            // {
            // actualHeight = (int) maxHeight;
            // actualWidth = (int) maxWidth;
            //
            // }
            // }

            // options.inSampleSize = utils.calculateInSampleSize(options, actualWidth, actualHeight);
            options.inSampleSize = imageScal;
            options.inJustDecodeBounds = false;
            options.inDither = true;
            options.inPurgeable = true;
            options.inInputShareable = true;
            options.inTempStorage = new byte[16 * 1024];

            try
            {
                bmp = BitmapFactory.decodeFile(filePath, options);
                bmp = decodeFile(filePath);
            }
            catch (OutOfMemoryError exception)
            {
                exception.printStackTrace();

            }
            boolean done = false;

            while (!done)
            {
                try
                {
                    scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888);

                    // scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888);

                    done = true;
                }
                catch (OutOfMemoryError exception)
                {
                    // 15923 × 1790
                    // 5616 × 3744
                    // 8150 × 9154
                    actualWidth = actualWidth - ((actualWidth * 2) / 100);
                    actualHeight = actualHeight - ((actualHeight * 2) / 100);
                    // scaledBitmap = Bitmap.createBitmap(5616, 3744, Bitmap.Config.ARGB_8888);
                    exception.printStackTrace();
                }

            }

            float ratioX = actualWidth / (float) options.outWidth;
            float ratioY = actualHeight / (float) options.outHeight;
            float middleX = actualWidth / 2.0f;
            float middleY = actualHeight / 2.0f;

            Matrix scaleMatrix = new Matrix();
            scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

            Canvas canvas = new Canvas(scaledBitmap);
            canvas.setMatrix(scaleMatrix);
            canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

            // Resize image stored in sdcard
            FileOutputStream out = null;
            // filename =AppConfig.fileTosaveMedia(context, FileType.IMAGE, true).getAbsolutePath();
            int compress = 50;
            try
            {
                do
                {
                    imgFile = AppConfig.fileTosaveMedia(context, FileType.IMAGE, true);
                    out = new FileOutputStream(imgFile);
                    scaledBitmap.compress(Bitmap.CompressFormat.JPEG, compress, out);

                    resizeImagePath = imgFile.getAbsolutePath();

                    // Thread.sleep(15000);
                    // imgFile = new File(filename);
                    bytes = imgFile.length();
                    kilobytes = (bytes / 1024);
                    megabytes = (kilobytes / 1024);
                    System.out.println("resized image size in mb:" + df.format(megabytes));

                    filesize = Double.parseDouble(df.format(megabytes));
                    if (filesize > 2.00f)
                    {
                        compress = 30;
                    }
                } while (filesize > 2.00f);
                scaledBitmap.recycle();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        else
        {

            FileOutputStream out = null;
            // FileInputStream in = null;
            imgFile = AppConfig.fileTosaveMedia(context, FileType.IMAGE, true);
            resizeImagePath = imgFile.getAbsolutePath();
            InputStream in = null;
            OutputStream outTemp = null;
            try
            {

                // create output directory if it doesn't exist

                in = new FileInputStream(filePath);
                outTemp = new FileOutputStream(resizeImagePath);

                byte[] buffer = new byte[1024];
                int read;
                while ((read = in.read(buffer)) != -1)
                {
                    outTemp.write(buffer, 0, read);
                }
                in.close();
                in = null;

                // write the output file (You have now copied the file)
                outTemp.flush();
                outTemp.close();
                outTemp = null;

            }
            catch (FileNotFoundException fnfe1)
            {
                Log.e("tag", fnfe1.getMessage());
            }
            catch (Exception e)
            {
                Log.e("tag", e.getMessage());
            }

            // try
            // {
            // Bitmap bmp = decodeFile(filePath);
            // // in = new FileInputStream(new File(imagePath));
            // // persistImage(bitmap, name);
            // out = new FileOutputStream(resizeImagePath);
            // bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
            // out.flush();
            // out.close();
            // // FileIO.copyStream(in, out);
            // }
            // catch (Exception e)
            // {
            // e.printStackTrace();
            // }
        }
        CustomLogHandler.printDebug(TAG, "resizeImagePath:" + resizeImagePath);
        return resizeImagePath;
    }

我花了这么多时间在Google搜索和阅读博客。然后在创建上面的代码后,我发现 this

I spent so much time on Google search and reading blogs. Then after creating the above code, I found this.

上述代码是否正确?

请帮助我。

推荐答案

尝试下面的代码: -

Try below code :-

public String compressImage(String imageUri) {

        String filePath = getRealPathFromURI(imageUri);
        Bitmap scaledBitmap = null;

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

//      by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If
//      you try the use the bitmap here, you will get null.
        options.inJustDecodeBounds = true;
        Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

        int actualHeight = options.outHeight;
        int actualWidth = options.outWidth;

//      max Height and width values of the compressed image is taken as 816x612

        float maxHeight = 816.0f;
        float maxWidth = 612.0f;
        float imgRatio = actualWidth / actualHeight;
        float maxRatio = maxWidth / maxHeight;

//      width and height values are set maintaining the aspect ratio of the image

        if (actualHeight > maxHeight || actualWidth > maxWidth) {
            if (imgRatio < maxRatio) {               imgRatio = maxHeight / actualHeight;                actualWidth = (int) (imgRatio * actualWidth);               actualHeight = (int) maxHeight;             } else if (imgRatio > maxRatio) {
                imgRatio = maxWidth / actualWidth;
                actualHeight = (int) (imgRatio * actualHeight);
                actualWidth = (int) maxWidth;
            } else {
                actualHeight = (int) maxHeight;
                actualWidth = (int) maxWidth;

            }
        }

//      setting inSampleSize value allows to load a scaled down version of the original image

        options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);

//      inJustDecodeBounds set to false to load the actual bitmap
        options.inJustDecodeBounds = false;

//      this options allow android to claim the bitmap memory if it runs low on memory
        options.inPurgeable = true;
        options.inInputShareable = true;
        options.inTempStorage = new byte[16 * 1024];

        try {
//          load the bitmap from its path
            bmp = BitmapFactory.decodeFile(filePath, options);
        } catch (OutOfMemoryError exception) {
            exception.printStackTrace();

        }
        try {
            scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888);
        } catch (OutOfMemoryError exception) {
            exception.printStackTrace();
        }

        float ratioX = actualWidth / (float) options.outWidth;
        float ratioY = actualHeight / (float) options.outHeight;
        float middleX = actualWidth / 2.0f;
        float middleY = actualHeight / 2.0f;

        Matrix scaleMatrix = new Matrix();
        scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

        Canvas canvas = new Canvas(scaledBitmap);
        canvas.setMatrix(scaleMatrix);
        canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

//      check the rotation of the image and display it properly
        ExifInterface exif;
        try {
            exif = new ExifInterface(filePath);

            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION, 0);
            Log.d("EXIF", "Exif: " + orientation);
            Matrix matrix = new Matrix();
            if (orientation == 6) {
                matrix.postRotate(90);
                Log.d("EXIF", "Exif: " + orientation);
            } else if (orientation == 3) {
                matrix.postRotate(180);
                Log.d("EXIF", "Exif: " + orientation);
            } else if (orientation == 8) {
                matrix.postRotate(270);
                Log.d("EXIF", "Exif: " + orientation);
            }
            scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                    true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        FileOutputStream out = null;
        String filename = getFilename();
        try {
            out = new FileOutputStream(filename);

//          write the compressed bitmap at the destination specified by filename.
            scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return filename;

    }

有关信息,请参阅以下链接: -

for for information see below link :-

http://voidcanvas.com/whatsapp-like- image-compression-in-android /

这篇关于图像压缩像Whatsapp和Android上的其他信使的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆