我正在制作一个显示房间图片的应用程序。当用户单击图片时,会弹出一张图像,其中包含该物体的文字,并且设备会说出该名称。为此,我加载一个图案图像,该图像在对象位置具有彩色 block ,以及一个文本文件,其中不同的对象名称映射到该 block 的特定颜色。
我还制作了一个 Java 应用程序,可用于创建这两个文件。用户在图像上绘制矩形,应用程序将绘制的矩形保存到新的图像文件中。
以下是用于创建/保存图像的 Java 代码:
BufferedImage i = new BufferedImage(img.getWidth(), img.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = i.getGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, i.getWidth(), i.getHeight());
//draw all the rectangles on the image
for(Rectangle r: rects.keySet()){
g.setColor(rects.get(r));
g.fillRect(r.x, r.y, r.width, r.height);
}
//write the BufferedImage to the file
try {
ImageIO.write(i, "png", saveTo);
} catch (IOException e) {
e.printStackTrace();
}
当我在 Photoshop、Paint 等中打开图片时,它会验证彩色 block 是否是它们应有的颜色。
当我将它们加载到 Android 设备中时,它们的颜色不一样。每种颜色的差异范围为 1-3(因此 25:0:0 的颜色会读作 24:0:0 或可能是 22:0:0)。
在设备上,我将图像加载为位图,并使用 TouchEvent.getX() 和 getY() 查找图像上的位置。然后我使用 Bitmap.getPixel(x,y) 来获取特定颜色。
如果我使用 Photoshop 或 Paint 等编辑器,我会得到读起来像平常一样的完美图像。我的用户要求使用他们自己的编辑器应用程序,因此它也可以创建配置文件。
抱歉这么长,感谢您的帮助!
最佳答案
将您的彩色 block 加载为 Assets ,而不是资源。 Android 会压缩并重新打包资源文件夹中的位图以最小化其大小。我相信压缩是导致颜色变化的原因。
使用 ADB 从设备中提取镜像来查看设备上的镜像是否实际上不同可能会很有趣。我希望是这样。
资源文件夹中包含的位图根本不会被处理。将它们用于需要保持当前质量的图像。
关于java - 在 Android 应用程序中解析 Java 生成的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144746/