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();
}
这段代码有效,但没有同时显示它们!
这是我的目标:
我该怎么做。如果你知道我该怎么做,请帮忙!
注意:
1.我从来不想把2个位图组合成另一个位图并保存目标位图。
- 如果您知道另一种不使用字节数组将 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
但是,它没有您想要的功能。您必须自行添加:
- 创建 function/s 用于存储从 Java 世界到 JNI 世界的位图。
- 创建用于合并图像并获取结果的函数。
您甚至可以同时拥有一个 Java 位图对象,而不是上面 Java 解决方案中的 3 个(2 个输入 + 1 个输出)。
一些注意事项:
使用 JNI 可能会更慢,因为它需要从 Java 位图对象转换为 JNI 并返回。对于大位图尤其如此。
最后还是要hold住输出的Java Bitmap对象。如果它是 10000x10000 像素,它将占用 10000*10000*4 字节,即 400,000,000 字节,即 ~400MB 。如果输入图像没有透明度,您可以使用不同的位图配置 (RGB_565) ,这将占用约 200MB 的 RAM。
在这两种情况下,这都很多。您可以在清单中添加一个标志来告诉 OS 您需要大量堆内存 (largeHeap) ,但这不是获得它的安全方法,因为您仍然可能无法获得足够的堆内存。在尝试创建输出位图之前,您应该检查可用的堆内存量。
解决此问题的另一种方法是避免显示整个位图,因为 Android 设备上没有具有此分辨率的屏幕。您可以改为只显示要在屏幕上显示的位图的一部分,以及可以留在 JNI 中的计算内容。
如果我的库不够用,还有其他使用 JNI 的库。我相信其中之一可以提供帮助。
我想将 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();
}
这段代码有效,但没有同时显示它们!
这是我的目标:
我该怎么做。如果你知道我该怎么做,请帮忙!
注意: 1.我从来不想把2个位图组合成另一个位图并保存目标位图。
- 如果您知道另一种不使用字节数组将 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
但是,它没有您想要的功能。您必须自行添加:
- 创建 function/s 用于存储从 Java 世界到 JNI 世界的位图。
- 创建用于合并图像并获取结果的函数。
您甚至可以同时拥有一个 Java 位图对象,而不是上面 Java 解决方案中的 3 个(2 个输入 + 1 个输出)。
一些注意事项:
使用 JNI 可能会更慢,因为它需要从 Java 位图对象转换为 JNI 并返回。对于大位图尤其如此。
最后还是要hold住输出的Java Bitmap对象。如果它是 10000x10000 像素,它将占用 10000*10000*4 字节,即 400,000,000 字节,即 ~400MB 。如果输入图像没有透明度,您可以使用不同的位图配置 (RGB_565) ,这将占用约 200MB 的 RAM。
在这两种情况下,这都很多。您可以在清单中添加一个标志来告诉 OS 您需要大量堆内存 (largeHeap) ,但这不是获得它的安全方法,因为您仍然可能无法获得足够的堆内存。在尝试创建输出位图之前,您应该检查可用的堆内存量。
解决此问题的另一种方法是避免显示整个位图,因为 Android 设备上没有具有此分辨率的屏幕。您可以改为只显示要在屏幕上显示的位图的一部分,以及可以留在 JNI 中的计算内容。
如果我的库不够用,还有其他使用 JNI 的库。我相信其中之一可以提供帮助。