Java 以编程方式合并png文件
我意识到这个主题有很多帖子,我已经用它们走了这么远,但我觉得我需要一点额外的东西才能越过这座山,因为它们都没有演示在这个过程中使用阵列 我正在构建一个儿童友好的数学应用程序,因此,我使用.png文件来显示相关的数字。我在drawable文件夹中有png格式的数字0-9(透明属性所需),在使用数字0-9时测试工作正常,但我希望应用程序的范围更进一步-数字>10(可能>100)-但如果我为每个数字创建一个png文件,并因此希望以编程方式组合这些png文件以供显示,然后将其删除(如果唯一的方法是创建一个新文件以显示),则会觉得应用程序的大小太大 首先,我已将文件输入位图数组-Java 以编程方式合并png文件,java,android,image-processing,png,bitmapfactory,Java,Android,Image Processing,Png,Bitmapfactory,我意识到这个主题有很多帖子,我已经用它们走了这么远,但我觉得我需要一点额外的东西才能越过这座山,因为它们都没有演示在这个过程中使用阵列 我正在构建一个儿童友好的数学应用程序,因此,我使用.png文件来显示相关的数字。我在drawable文件夹中有png格式的数字0-9(透明属性所需),在使用数字0-9时测试工作正常,但我希望应用程序的范围更进一步-数字>10(可能>100)-但如果我为每个数字创建一个png文件,并因此希望以编程方式组合这些png文件以供显示,然后将其删除(如果唯一的方法是创建一
bitmapNumbers[0] = BitmapFactory.decodeResource(getResources(), R.drawable.zero);
bitmapNumbers[1] = BitmapFactory.decodeResource(getResources(), R.drawable.one);
bitmapNumbers[2] = BitmapFactory.decodeResource(getResources(), R.drawable.two);
bitmapNumbers[3] = BitmapFactory.decodeResource(getResources(), R.drawable.three);
bitmapNumbers[4] = BitmapFactory.decodeResource(getResources(), R.drawable.four);
bitmapNumbers[5] = BitmapFactory.decodeResource(getResources(), R.drawable.five);
bitmapNumbers[6] = BitmapFactory.decodeResource(getResources(), R.drawable.six);
bitmapNumbers[7] = BitmapFactory.decodeResource(getResources(), R.drawable.seven);
bitmapNumbers[8] = BitmapFactory.decodeResource(getResources(), R.drawable.eight);
bitmapNumbers[9] = BitmapFactory.decodeResource(getResources(), R.drawable.nine);
当活动加载时,它调用一个方法来生成和,并将其显示给用户,然后要求用户输入,该用户输入调用另一个方法来检查答案。以下是generateSum方法-
public void generateSum () {
String stringFirst;
String stringSecond;
Bitmap[] buildFirst;
Bitmap[] buildSecond;
String newFile = "";
Random rand = new Random();
// generate first random number
firstNumber = rand.nextInt(highestNumber + 1);
stringFirst = String.valueOf(firstNumber);
int[] splitFirst = new int[stringFirst.length()];
for (int i = 0; i < stringFirst.length(); i++) {
// split number down to individual 'single-digit' elements
splitFirst[i] = Integer.parseInt(stringFirst.substring(i, i + 1));
}
// generate second random number
secondNumber = rand.nextInt(highestNumber + 1);
stringSecond = String.valueOf(secondNumber);
int[] splitSecond = new int[stringSecond.length()];
for (int i = 0; i < stringSecond.length(); i++) {
// split number down to individual 'single-number' elements
splitSecond[i] = Integer.parseInt(stringSecond.substring(i, i + 1));
}
// calculate sum answer depending on mode selected in setup
switch (sPrefs.getString("sumMethod", null)) {
case ("Addition"):
answer = firstNumber + secondNumber;
break;
case ("Subtraction"):
if (secondNumber > firstNumber) {
while (secondNumber > firstNumber) {
firstNumber = rand.nextInt(highestNumber + 1);
secondNumber = rand.nextInt(highestNumber + 1);
}
}
answer = firstNumber - secondNumber;
break;
case ("Multiplication"):
answer = firstNumber * secondNumber;
break;
default:
return;
}
// build Bitmap array based on first number generated and split
buildFirst = new Bitmap[splitFirst.length];
for (int i = 0; i < splitFirst.length; i++) {
for (int j = 0; j <= 9; j++) {
if (j == splitFirst[i]) {
// built from Bitmap array containing .png drawable resources
buildFirst[i] = bitmapNumbers[j];
}
}
}
// code to generate new merged .png file based on built arrays and .png files
Bitmap builtFirst = Bitmap.createBitmap(buildFirst[0].getWidth(), buildFirst[0].getHeight(), buildFirst[0].getConfig());
Canvas canvas = new Canvas(builtFirst);
newFile = buildFirst[0].toString();
if (buildFirst.length > 1) {
for (int i = 1; i < buildFirst.length; i++) {
canvas.drawBitmap(buildFirst[i], 0, 0, null);
canvas.drawBitmap(builtFirst, new Matrix(), null);
newFile = newFile + buildFirst[i].toString();
}
}
try {
FileOutputStream out = new FileOutputStream("android.resource://com.app.numberup/drawable/" + newFile);
builtFirst.compress(Bitmap.CompressFormat.PNG, 100, out);
imageViewFirstNumber.setImageBitmap(builtFirst);
} catch (Exception e) {
Log.i("Error caught", e.getMessage());
e.printStackTrace();
}
/*
buildSecond = new int[splitSecond.length];
for (int i = 0; i <= splitSecond.length; i++) {
for (int j = 0; j <= 9; j++) {
if (j == splitSecond[i]) {
buildSecond[i] = numbers[j];
}
}
}*/
// original code to display single numbers - worked
//imageViewFirstNumber.setImageResource(numbers[i]);
//imageViewSecondNumber.setImageResource(numbers[i]);
}
不会显示该文件。我不确定如何引用新生成的文件,但更大的问题是新文件不在可绘制文件夹中
我亦知道—
if (buildFirst.length > 1) {
for (int i = 1; i < buildFirst.length; i++) {
canvas.drawBitmap(buildFirst[i], 0, 0, null);
canvas.drawBitmap(builtFirst, new Matrix(), null);
newFile = newFile + buildFirst[i].toString();
}
}
我假设这是由于buildFirst[0]
的内容是“android.graphics”。Bitmap@1852540c'对于[1]中类似的内容(生成2位数字),是否可以不使用.png文件执行此过程?如果是这样,我如何合并它们,同时保持原始.png文件的透明属性?也许有更好的方法填充原始位图数组
如何解决此图像处理步骤?经过两天的反复试验,终于找到了解决方案 这里的问题是不需要压缩文件或写入任何新文件或使用任何位图作为模板,也不需要将新的drawable作为资源引用(而只是应用创建的位图变量)
Bitmap builtFirst = Bitmap.createBitmap(500 * splitFirst.length, 700, ARGB_8888);
Canvas canvas = new Canvas(builtFirst);
if (buildFirst.length > 1) {
for (int i = 0; i < buildFirst.length; i++) {
canvas.drawBitmap(buildFirst[i], 300 * i, 0, null);
canvas.drawBitmap(builtFirst, new Matrix(), null);
}
}
imageViewFirstNumber.setImageBitmap(builtFirst);
Bitmap buildltfirst=Bitmap.createBitmap(500*splitFirst.length,700,ARGB_8888);
Canvas Canvas=新画布(builtFirst);
如果(buildFirst.length>1){
for(int i=0;i
您必须创建位图。创建()并创建画布,然后在画布上绘制位图编号。例如,要生成数字10,您必须创建位图,位图的宽度为位图编号的两倍,并绘制位图编号[1],然后通过移位x位置位图编号[0],然后调用imageView setDrawable(),导致异常的是bitmap.createBitmap。在我使用之前,文件似乎需要再次编码,有什么想法吗?你必须在内存中创建位图,而不是在文件中。你能否发布一些示例代码来实现这一点,使用数组中的解码.png作为答案。请,这是我第一次尝试任何编程图像处理。我看到的示例使用位图来调整createBitmap的大小,因此我不太清楚您的意思,谢谢
Bitmap builtFirst = Bitmap.createBitmap(buildFirst[0].getWidth(), buildFirst[0].getHeight(), buildFirst[0].getConfig());
Bitmap builtFirst = Bitmap.createBitmap(500 * splitFirst.length, 700, ARGB_8888);
Canvas canvas = new Canvas(builtFirst);
if (buildFirst.length > 1) {
for (int i = 0; i < buildFirst.length; i++) {
canvas.drawBitmap(buildFirst[i], 300 * i, 0, null);
canvas.drawBitmap(builtFirst, new Matrix(), null);
}
}
imageViewFirstNumber.setImageBitmap(builtFirst);