ما هي أسرع طريقة لضغط الصور إلى حجم معين؟

In my project, I need to upload some images(1-10) to server sometimes. The size varies from 1M to 10M. Before upload,each image should be compressed until size<512KB. I do the compression like this:

public static byte[] compressImageA(Bitmap image, int maxSize) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int options = 100;
    image.compress(Bitmap.CompressFormat.JPEG, options, baos);
    while (baos.size()/1024 > maxSize) {
        baos.reset();
        options -= 10;
        image.compress(Bitmap.CompressFormat.JPEG, options, baos);
    }
    if (image != null && !image.isRecycled()) {
        try {
            image.recycle();
        } catch (Exception e) {
        }
    }
    return baos.toByteArray();
}

هذه الطريقة يمكن أن تجعلها ، ولكن ليس بالسرعة الكافية. على سبيل المثال ، يستغرق الأمر حوالي 25 ثانية لضغط 10 صور. (حجم كل منها بين 1M و 10 M). بعد بعض الاختبارات ، أجد Bitmap.compress() يمكن استدعائها عدة مرات وتستغرق معظم الوقت أثناء الضغط. فماذا يمكنني فعله لجعله أسرع؟ أريد Bitmap.compress() ليتم استدعاؤها مرة واحدة فقط خلال كل ضغط.أو توجد طريقة أخرى لضغط الصورة إلى حجم معين أكثر سرعة?

0

2 إجابة

يمكنك استخدام هذه الطريقة لتقليل الحجم من الحجم الفعلي

/**
     * reduces the size of the image
     *
     * @param image  uncompressed image
     * @param reduce how much to reduce
     * @return new bitmap
     */
    public static Bitmap reduceBitmap(Bitmap image, int reduce) {
        int width = image.getWidth();
        int height = image.getHeight();

        float bitmapRatio = (float) width/(float) height;
        if (bitmapRatio > 1) {
            width -= reduce;
            height = (int) (width/bitmapRatio);
        } else {
            height -= reduce;
            width = (int) (height * bitmapRatio);
        }
        if (width > 0 && height > 0)
            return Bitmap.createScaledBitmap(image, width, height, true);
        else
            return image;
    }

أو يمكنك استخدام الرموز أدناه وفقًا لحاجتك ، فأنا أستخدمها لـ PNG ويمكنك التحقق من وجود رموز أخرى

Bitmap actualImage=BitmapFactory.decodeStream(getAssets().open("imagg1.png"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
actualImage.compress(Bitmap.CompressFormat.PNG, 100, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));
0
وأضاف

الخوارزمية الخاصة بك بسرعة تقريبًا.

الوقت لبدء التفكير خارج الصندوق. 10 صور في 25 ثانية تعني أن صورة واحدة تستغرق 2.5 ثانية. ما مدى السرعة التي تريدها أن تكون؟ لحسن الحظ ، فإن الخوارزمية هي موازية بسهولة. حتى تتمكن من تقسيم المهمة عبر أجهزة الكمبيوتر n.

0
وأضاف
Android Sudan Community
Android Sudan Community
900 مشارك

كل اقتراحاتكم تتم مشاركتها هنا رابط القناة لتنزيل البرامج والالعاب من هنا @android_sudan تنبيه : القروب غير مختص إطلاقا بي الانترنت المجاني مثل ملفات الحاقن وماشابه يمنع منعا باتا نشر اي ملفات او برامج او اي شيء يتعلق بالانترنت المجان