Nano Hash - криптовалюты, майнинг, программирование

Создайте 1 imageView с 9 файлами изображений

Я искал способ создать один imageView из 9 файлов изображений, например:

IMG1 - IMG2 - IMG3

IMG4 - IMG5 - IMG6

IMG7 - IMG8 - IMG9

Я видел несколько интересных тем, которые мне помогают. Один из них говорит о решении, которое может удовлетворить мои потребности. В этой теме Димитар Димитров предлагает следующее:

Вы можете попробовать сделать это с необработанными данными, извлекая пиксельные данные из изображений в виде 32-битных массивов пикселей int ARGB, объединяя их в один большой массив и создавая новое Bitmap, используя методы класса Bitmap, такие как copyPixelsToBuffer ( ), createBitmap () и setPixels (). источник: Визуализировать два изображения в ImageView в Android?

Таким образом, я могу извлечь 32-битные пиксели ARGB из каждого файла изображения, а затем создать Bitmap, в котором я мог бы использовать функцию setPixels для заполнения. Проблема в том, что я не знаю, как я могу «извлечь 32 -биты пикселей ARGB из каждого файла изображения " ...

Я также видел кое-что о Canvas и SurfaceView, но никогда не использую их. Кроме того, конечный объект будет только иногда увеличиваться в масштабе (когда пользователь этого хочет), поэтому я думаю, что мне будет проще заставить его работать, используя один imageView ...

Итак, я начал с этой части кода внутри AsyncTask (чтобы избежать использования потока пользовательского интерфейса), но я уже получил исключение OUT OF MEMORY

...
@Override
protected Bitmap doInBackground(Void... params) {
     return this.createBigBitmap();
}

public Bitmap createBigBitmap() {

Bitmap pageBitmap = Bitmap.createBitmap(800, 1066, Bitmap.Config.ARGB_8888); // OUT OF MEMORY EXCEPTION

// create an ArrayList of the 9 page Parts
ArrayList<Bitmap> pageParts = new ArrayList<Bitmap>();
for(int pagePartNum = 1; pagePartNum <= 9; pagePartNum++){
    Bitmap pagePartBitmap = getPagePart(pageNum, pagePartNum);
    pageParts.add(pagePartBitmap);
}


// try to copy the content of the 9 bitmaps into a single one bitmap
int[] pixels = null;
            int offsetX = 0, offsetY = 0, pagePartNum = 0;

            for (int x = 0; x < this.nbPageRows; x++) {
                for (int y = 0; y < this.nbPageColumns; y++) {
                    pagePartNum = x * this.nbPageColumns + y;
                    Bitmap pagePartBitmap = pageParts.get(pagePartNum);
                    // read pixels from the pagePartBitmap
                    pixels = new int[pagePartBitmap.getHeight() * pagePartBitmap.getWidth()];
                    pagePartBitmap.getPixels(pixels, 0, pagePartBitmap.getWidth(), 0, 0, pagePartBitmap.getWidth(), pagePartBitmap.getHeight());

                    // compute offsetY
                    if(x == 0)
                        offsetY = 0;
                    if(x == 1)
                        offsetY = pageParts.get(0).getHeight();
                    if(x == 2)
                        offsetY = pageParts.get(0).getHeight() * 2;

                    // compute offsetX
                    if(y == 0)
                        offsetX = 0;
                    if(y == 1)
                        offsetX = pageParts.get(0).getWidth();
                    if(y == 2)
                        offsetX = pageParts.get(0).getWidth() * 2;


                    // write pixels read to the pageBitmap
                    pageBitmap.setPixels(pixels, 0, pagePartBitmap.getWidth(), offsetX, offsetY, pagePartBitmap.getWidth(), pagePartBitmap.getHeight());
                    offsetX += pagePartBitmap.getWidth();
                    offsetY += pagePartBitmap.getHeight();

                }
            }
return pageBitmap;
}

// get a bitmap from one of the 9 existing image file page part
private Bitmap getPagePart(int pageNum, int pagePartNum) {
        String imgFilename = this.directory.getAbsolutePath()
                + File.separator + "z-"
                + String.format("%04d", pageNum)
                + "-" + pagePartNum + ".jpg";
        // ajoute le bitmap de la partie de page
        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
        return BitmapFactory.decodeFile(imgFilename, opt);
    }

Большое тебе спасибо

25.02.2013

  • Прошу прощения, так как этот пример кода, кажется, работает, на самом деле ошибка находится за пределами этой части кода. 26.02.2013

Ответы:


1

Прочтите BitmapRegionDecoder и this

Изменить

Посмотрите на Эффективную обработку растровых изображений в Android, чтобы выйти из ошибки OOM . Используйте следующий код для декодирования растрового изображения.

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = 4;

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}
25.02.2013
  • Привет, Чинтан! Я не понимаю весь код образца, но полагаю, что BitmapRegionDecoder позволяет декодировать часть растрового изображения. В моем случае это обратная операция, я беру всю часть файлов изображений, чтобы сделать один большой 25.02.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..