Подтвердить что ты не робот

Создайте файл с возможностью рисования

У меня есть большое количество ресурсов в моей доступной папке. Все имеют большой размер более 500 КБ. Я должен загрузить все эти 25 изображений одновременно в srollView. Как обычно, у меня не хватало памяти. Есть ли способ уменьшить размер изображения программно.

Я получил эту функцию, но этот параметр является файлом, и я не знаю, как создать файл из drawable.

private Bitmap decodeFile(File f){
    Bitmap b = null;
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        FileInputStream fis = new FileInputStream(f);
        BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        int scale = 1;
        if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
            scale = Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        fis = new FileInputStream(f);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (FileNotFoundException e) {
    }
    return b;
}

Мне нужно многократно смотреть на этот экран многократно после нескольких обходов системы, показывающих низкую память, и она удаляет другие представления в обратном направлении из стека, но мне это действительно нужно. Пожалуйста, помогите мне.

4b9b3361

Ответ 1

Вы можете открыть InputStream из вашего ресурса с помощью следующего кода:

InputStream is = getResources().openRawResource(id);

здесь id - это идентификатор ресурса, который вы используете. например: R.drawable.abc

Теперь, используя этот входной поток, вы можете создать файл. Если вам также нужна помощь в том, как создать файл, используя этот входной поток, скажите мне.

Обновление: для записи данных в файл:

try
    {
    File f=new File("your file name");
    InputStream inputStream = getResources().openRawResource(id);
    OutputStream out=new FileOutputStream(f);
    byte buf[]=new byte[1024];
    int len;
    while((len=inputStream.read(buf))>0)
    out.write(buf,0,len);
    out.close();
    inputStream.close();
    }
    catch (IOException e){}
    }

Ответ 2

Мне нравятся ярлыки, поэтому я предпочитаю использовать this.

Для файла создания файла из рисунка см. this.

Поместите это в свой build.gradle

compile 'id.zelory:compressor:1.0.4'

И везде, где вы хотите сжать изображение, поставьте

 Bitmap compressedImageFile = Compressor.getDefault(context).compressToBitmap(your_file);

README.md предоставляет гораздо больше информации. Прошу прощения за ответ через 6 лет.

Ответ 3

bro существует два метода

  • Самый простой. Используйте некоторую стороннюю библиотеку.
  • Или используйте класс Bitmap для масштабирования вниз

просто используйте метод Bitmap.createScaledBitmap для сжатия чертежей

:

//Шаг 1 Загрузите выделение и преобразуйте его в растровое изображение

Bitmap b = BitmapFactory.decodeResource( context , resId )

//Шаг 2 перетащите ваш растровый рисунок

Bitmap nBitmap = b.createScaledBitmap( getResources() , newHieght , newWidth , true );  

//Шаг 3 Создаем чертеж из растрового изображения

BitmapDrawable drawable = new BitmapDrawable(nBitmap);

Я настоятельно рекомендую вам использовать библиотеку третьей части, потому что этот метод очень дорог

как https://github.com/Tourenathan-G5organisation/SiliCompressor

Ответ 4

Я взял реплику из ответа @mudit и создал переносимый из Input Stream. А затем загрузили переносимый в ImageView в адаптер.

InputStream inputStream = mContext.getResources(). openRawResource (R.drawable.your_id);

Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);
mImageView.setImageDrawable(d);

Здесь - подробная версия решения