Я искал способ создать один 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);
}
Большое тебе спасибо