Android - 将 2 个位图保存到一个图像文件中

Android - Save 2 bitmap into just one Image file

我想将 2 个位图并排保存到一个有效图像文件中。

我可以保存 booth 位图中的所有字节,图像文件是有效的图像字节,我可以打开并看到它,但图像中只显示了第一个位图!

我试过了:

void save_bitmaps()
{
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/req_images");
    myDir.mkdirs();
    String fname = "Map"+ String.valueOf(10) + ".png";
    File file = new File(myDir, fname);
    for(int i=0;i<2;i++)
    {
        int count=0;
        //------------------------------------------
        Bitmap bitmap = Bitmap.createBitmap(500,500,Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bitmap);
        if(i==0)
            c.drawColor(Color.BLUE);
        if(i==1)
            c.drawColor(Color.RED);

        bitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
        byte[] bytarray = stream.toByteArray();
        //----------------------------------------------------------------
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            out.write(bytarray,count,bytarray.length);
            out.flush();
            out.close();
            count+=bytarray.length;
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getContext() , "ERROR" , Toast.LENGTH_SHORT).show();
        }

    }
    Toast.makeText(getContext() ,"Saved" , Toast.LENGTH_SHORT).show();
}

这段代码有效,但没有同时显示它们!

这是我的目标:

Target_Image_File

我该怎么做。如果你知道我该怎么做,请帮忙!

注意: 1.我从来不想把2个位图组合成另一个位图并保存目标位图。

  1. 如果您知道另一种不使用字节数组将 2 个位图保存到一个图像文件中的方法,请告诉我!

谢谢大家!

使用以下代码您可以添加图像并并排保存。 这对我有用。 祝你一切顺利,希望你的解决方案正确。

我在组合图像本身中添加了保存文件功能。您可以根据您的实现逻辑对其进行更改,因为组合图像将作为函数的输出。

public Bitmap combineImages(Bitmap c, Bitmap s) { 
Bitmap cs = null; 

int width, height = 0; 

if(c.getWidth() > s.getWidth()) { 
  width = c.getWidth() + s.getWidth(); 
  height = c.getHeight(); 
} else { 
  width = s.getWidth() + s.getWidth(); 
  height = c.getHeight(); 
} 

cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

Canvas comboImage = new Canvas(cs); 

comboImage.drawBitmap(c, 0f, 0f, null); 
comboImage.drawBitmap(s, c.getWidth(), 0f, null); 

String tmpImg = String.valueOf(System.currentTimeMillis()) + ".png"; 
String loc="IMAGE Combined-";
OutputStream os = null; 
try { 
  os = new FileOutputStream(loc + tmpImg); 
  cs.compress(CompressFormat.PNG, 100, os); 
} catch(IOException e) { 
  Log.e("combineImages", "problem combining images", e); 
}*/ 

return cs; 
} 

如果你愿意,你可以使用我制作的这个库,它可以通过 JNI 处理大图像文件:

https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations

但是,它没有您想要的功能。您必须自行添加:

  1. 创建 function/s 用于存储从 Java 世界到 JNI 世界的位图。
  2. 创建用于合并图像并获取结果的函数。

您甚至可以同时拥有一个 Java 位图对象,而不是上面 Java 解决方案中的 3 个(2 个输入 + 1 个输出)。

一些注意事项:

  1. 使用 JNI 可能会更慢,因为它需要从 Java 位图对象转换为 JNI 并返回。对于大位图尤其如此。

  2. 最后还是要hold住输出的Java Bitmap对象。如果它是 10000x10000 像素,它将占用 10000*10000*4 字节,即 400,000,000 字节,即 ~400MB 。如果输入图像没有透明度,您可以使用不同的位图配置 (RGB_565) ,这将占用约 200MB 的 RAM。

    在这两种情况下,这都很多。您可以在清单中添加一个标志来告诉 OS 您需要大量堆内存 (largeHeap) ,但这不是获得它的安全方法,因为您仍然可能无法获得足够的堆内存。在尝试创建输出位图之前,您应该检查可用的堆内存量。

  3. 解决此问题的另一种方法是避免显示整个位图,因为 Android 设备上没有具有此分辨率的屏幕。您可以改为只显示要在屏幕上显示的位图的一部分,以及可以留在 JNI 中的计算内容。

  4. 如果我的库不够用,还有其他使用 JNI 的库。我相信其中之一可以提供帮助。