Как преобразовать изображение в желаемое пиксельное изображение в студии android и загрузить его в облачное хранилище - PullRequest
1 голос
/ 26 апреля 2020

В настоящее время я выбираю изображение из библиотеки в качестве Uri из галереи устройств, а затем преобразовываю его в растровое изображение, а затем в BAOS в соответствии с размером Uri после загрузки его в облачное хранилище. Я хочу, чтобы каждое изображение в облачном хранилище было размером 200 * 200 пикселей.

Мой код

File f = new File(resultUri.getPath());
        long sizeUri = f.length()/1024;

        int quality;
        if (sizeUri <= 300)
            quality = 30;
        else if (sizeUri <= 1000)
            quality = 10;
        else if (sizeUri <= 2000)
            quality = 10;
        else if (sizeUri <= 3000)
            quality = 10;
        else
            quality= 5;



        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        byte[] uploadbaos = baos.toByteArray();

        UploadThumbnail(); 

1 Ответ

0 голосов
/ 26 апреля 2020

вы можете попробовать это

public static String resizeAndCompressImageBeforeSend(Context context, String filePath, String fileName) {
    final int MAX_IMAGE_SIZE = 350 * 512; // max final file size in kilobytes

    // First decode with inJustDecodeBounds=true to check dimensions of image
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize(First we are going to resize the image to 800x800 image, in order to not have a big but very low quality image.
    //resizing the image will already reduce the file size, but after resizing we will check the file size and start to compress image
    options.inSampleSize = calculateInSampleSize(options, 800, 800);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;

    Bitmap bmpPic = BitmapFactory.decodeFile(filePath, options);

    int compressQuality = 100; // quality decreasing by 5 every loop.
    int streamLength;
    do {
        ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
        //Log.d("compressBitmap", "Quality: " + compressQuality);
        bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream);
        byte[] bmpPicByteArray = bmpStream.toByteArray();
        streamLength = bmpPicByteArray.length;
        compressQuality -= 5;
        //Log.d("compressBitmap", "Size: " + streamLength/1024+" kb");
    } while (streamLength >= MAX_IMAGE_SIZE);

    try {
        //save the resized and compressed file to disk cache
        //Log.d("compressBitmap","cacheDir: "+ context.getCacheDir());
        FileOutputStream bmpFile = new FileOutputStream(context.getCacheDir() + fileName);
        bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile);
        bmpFile.flush();
        bmpFile.close();
    } catch (Exception e) {
        Log.e("compressBitmap", "Error on saving file");
    }
    //return the path of resized and compressed file
    return context.getCacheDir() + fileName;
}

static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    String debugTag = "MemoryInformation";
    // The width and height of the Image n before being processed
    final int height = options.outHeight;
    final int width = options.outWidth;
    //Log.d(debugTag,"image height: "+height+ "---image width: "+ width);
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }
    //Log.d(debugTag,"inSampleSize: "+inSampleSize);
    return inSampleSize;
}

вы можете использовать это, чтобы изменить размер растрового изображения

    private static Bitmap resize(Bitmap image, int maxWidth, int maxHeight) {
    try {
        if (maxHeight > 0 && maxWidth > 0) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;

            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax > ratioBitmap) {
                finalWidth = (int) ((float) maxHeight * ratioBitmap);
            } else {
                finalHeight = (int) ((float) maxWidth / ratioBitmap);
            }
            image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);
            return image;
        } else {
            return image;
        }
    } catch (Exception e) {
        return image;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...