java - java.awt 的 Android 替代品(BufferedImage 和 Raster)

标签 java android awt bufferedimage raster

我正在为我的最后一年项目开发一个 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_lockPixelsAndroidBitmap_unlockPixels 可能是一个不错的起点。

最后,另一个应该表现良好的选项是使用 RenderScript .

如果您只想将图像加载到 int 数组中,Bitmap.getPixels 就足够了。

关于java - java.awt 的 Android 替代品(BufferedImage 和 Raster),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21921782/

相关文章:

java - 卷起框架后面板组件移动

java - 菜单系统可以工作但无法关闭

java - JFileChooser 将在服务器或另一台机器上工作吗?

java - Android:哪个运算符用于模数(%不适用于负数)

java - Spring jpa - oneToOne不从辅助表中选择数据 - mySql

android - Android中的按钮列表

java - android 新手 - 使用 'ant' 编译有什么好处?

java - C++ 中的 JNI CallIntMethod 返回错误值

Java循环无限运行

Android Button 将图片放在中心,文本放在底部