Android alternative to java.awt (BufferedImage and Raster)



对于我最后一年的项目,我正在开发一个Android应用程序,可以捕获叶子的图像并识别它来自哪种类型的树。 我有一个几乎完成的PC版本(用java开发),我正在开始将其移植到Android的过程。 虽然BufferedImage和光栅构成了我的程序的关键部分,但这是一个问题,因为 android 中缺少java.awt,所以这意味着我必须更改库。

我正在使用由我的讲师开发的库,下面的方法使用光栅将缓冲图像转换为 IntImage(在整个包中使用的类型)。

基本上是在问我可以使用java.awt是否有任何安卓替代品?

代码如下:

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)的任何人,因此此算法采用像素值广告将它们存储在2D数组(像素)中。

听起来您只想使用位图并能够操作数组中的像素本身。Bitmap类及其getPixels方法一起浮现在脑海中。请记住,移动设备上的内存要有限得多。使用大位图时很容易遇到内存不足问题。

另一种途径是使用 NDK。我在那里没有太多经验,但AndroidBitmap_lockPixelsAndroidBitmap_unlockPixels可能是一个很好的起点。

最后,另一个应该表现得很好的选项是使用RenderScript。

如果您要做的就是将

图像加载到int数组中,那么Bitmap.getPixels应该足够了。

您可以将

BufferedImage转换为PNG或JPEG,然后通过HTTP将其发送到Android,然后可以将PNG或JPEG转换回Bitmap并使用它。当Android需要发送任何图像时,通过网络将其作为PNG或JPEG发送,然后将PNG转换为BufferedImage并在程序中使用它。

最新更新