4

伙计们,我有一个解决方案可以从 5 个不同的另一个中创建一个位图。但是,我希望这个解决方案更快。我找不到另一种简单快捷的方法来做同样的事情。

private void createImage() {
    // Magic numbers from image files
    int numberOfImages = 5;
    int imgWidth = 125;
    int imgHeight = 300;
    int totalwidth = imgWidth * numberOfImages;
    int totalheight = imgHeight;


    img = Bitmap.createBitmap(totalwidth, totalheight, Bitmap.Config.ARGB_8888);

    for (int i = 0; i < numberOfImages; i++) {
        Bitmap imgFile = BitmapFactory.decodeResource(context.getResources(), context.getResources().getIdentifier(
                "f" + i, "drawable", context.getPackageName()));
        for (int x = 0; x < imgWidth; x++) {
            for (int y = 0; y < imgHeight; y++) {
                int targetX = x + (i * imgWidth);
                int targetY = y;
                int color = imgFile.getPixel(x, targetY);
                img.setPixel(targetX, targetY, color);
            }
        }
    }


    img = Bitmap.createScaledBitmap(img, screenWidth, screenHeight, true);

}
4

3 回答 3

4

你大部分时间都在那里。您已经创建了一个足够宽的位图以供所有人使用。

然后您需要做的是一次将位图直接绘制到其上,但一次绘制整个位图,而不是逐个像素。

您可以使用调用来执行此操作Canvas。这有助于将事物绘制到位图上。

img = Bitmap.createBitmap(totalwidth, totalheight, Bitmap.Config.ARGB_8888);
Canvas drawCanvas = new Canvas(img);

for (int i = 0; i < numberOfImages; i++) {
    Bitmap imgFile = BitmapFactory.decodeResource(context.getResources(), context.getResources().getIdentifier(
            "f" + i, "drawable", context.getPackageName()));

          // Draw bitmap onto combo bitmap, at offset x, y.
          drawCanvas.drawBitmap(imgFile, i * imgWidth, 0, null);


}
于 2012-12-01T22:14:11.050 回答
1

我想Bitmap.getPixels()andBitmap.setPixels()方法可能会有所帮助。

private void createImage() {
    // Magic numbers from image files
    int numberOfImages = 5;
    int imgWidth = 125;
    int imgHeight = 300;
    int totalwidth = imgWidth * numberOfImages;
    int totalheight = imgHeight;


    img = Bitmap.createBitmap(totalwidth, totalheight, Bitmap.Config.ARGB_8888);

    int buf[] = new int[totalwidth * totalheight];

    for (int i = 0; i < numberOfImages; ++i) {
        Bitmap imgFile = BitmapFactory.decodeResource(context.getResources(),
            context.getResources().getIdentifier(
                "f" + i, "drawable", context.getPackageName()));
        imgFile.getPixels(buf, i*imgWidth, totalwidth, 0, 0, imgWidth, imgHeight);
    }
    img.setPixels(buf, 0, totalwidth, 0, 0, totalwidth, totalheight);

    img = Bitmap.createScaledBitmap(img, screenWidth, screenHeight, true);

}

我没有尝试过,但根据文档 我认为它应该可以工作。我想它有望快得多,因为我们只用 6 个函数调用来完成所有工作,假设这些函数在幕后做的事情比仅仅遍历数组(例如直接内存复制)更聪明。

于 2012-12-01T22:24:12.217 回答
1

Doomsknight 的回答对我来说似乎是正确的,但您不应该在 Android 的主线程上执行此类进程。太多的图像可能会达到16 毫秒的障碍

您可以在后台处理程序线程中执行此操作,并在完成后更新 UI 线程。

HandlerThread cropperHandlerThread = new HandlerThread("background_cropper");
cropperHandlerThread.start();
// Do not call getLooper before start handler thread.
Handler cropperHandler = new Handler(cropperHandlerThread.getLooper());
cropperHandler.post(new Runnable() {
    @Override
    public void run() {
        // Create Bitmap Here
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // Update ImageView here
            }
        });
    }
});
于 2018-04-16T19:28:19.097 回答