我正在为我的最后一年项目开发一个 Android 应用程序,它可以捕捉一片叶子的图像并识别它来自哪种类型的树。我有一个接近完成的 PC 版本(用 java 开发),我正在开始将它移植到 android 的过程。虽然 BufferedImage
和 Raster 构成了我程序的关键部分,但这是一个问题,因为 android 中缺少 java.awt
,所以这意味着我必须更改库。
我正在使用我的讲师开发的库,下面的方法使用 Raster 将 BufferedImage 转换为 IntImage(一种在整个包中使用的类型)。
我基本上是在问,有没有我可以使用的 java.awt
的 android 替代品?
代码如下:
public static int[][] readAsInts(String fileName) throws IOException {
int[][] pixels;
System.out.println("File: " + fileName);
String [] types = ImageIO.getReaderFileSuffixes();
for (int l = 0; l < types.length; l++) {
System.out.println("Type " + l + ": " + types[l]);
}
File f = new File(fileName);
BufferedImage bi;
bi = ImageIO.read(f);
int cols = bi.getWidth();
int rows = bi.getHeight();
System.err.println("Number of bands: " + bi.getRaster().getNumBands());
Raster rast = bi.getRaster();
pixels = new int[rows][cols];
for (int r = 0; r < rows; r++) {
rast.getSamples(0, r, cols, 1, 0, pixels[r]);
}
return pixels;
} // readAsInts
谢谢大家!
编辑:对于不知道光栅存储 BufferedImage 的像素值以及波段数(红色、绿色、蓝色、alpha)的任何人,因此该算法采用像素值并将它们存储在二维数组(像素)。
最佳答案
听起来您只想使用位图并能够操纵数组中的像素本身。 Bitmap
类与其 getPixels
一起浮现在脑海中方法。请记住,您在移动设备上的内存要有限得多。在处理大型位图时很容易遇到内存不足的问题。
另一种方法是使用 NDK。我在这方面经验不多,但 AndroidBitmap_lockPixels
和 AndroidBitmap_unlockPixels
可能是一个不错的起点。
最后,另一个应该表现良好的选项是使用 RenderScript .
如果您只想将图像加载到 int
数组中,Bitmap.getPixels
就足够了。
关于java - java.awt 的 Android 替代品(BufferedImage 和 Raster),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21921782/