J2ME中是否有可能将图像(从带有alpha的PNG文件加载)转换为新的透明灰度图像?

到目前为止,我只有RGB值,但没有得到Alpha。

谢谢。

编辑:是的,应该是32位灰度。

有帮助吗?

解决方案

我找到了解决方案,这是代码:

    public Image getGrayScaleImage() {
    int[] rgbData = new int[getWidth() * getHeight()];
    image.getRGB(rgbData, 0, getWidth(), 0, 0, getWidth(), getHeight());
    for (int x = 0; x < getWidth() * getHeight(); x++) {
        rgbData[x] = getGrayScale(rgbData[x]);
    }
    Image grayImage = Image.createRGBImage(rgbData, getWidth(), getHeight(), true);
    return grayImage;
}

private int getGrayScale(int c) {
    int[] p = new int[4];
    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level
    p[3] = (int) (c & 0x000000FF); // Blue level

    int nc = p[1] / 3 + p[2] / 3 + p[3] / 3;
    // a little bit brighter
    nc = nc / 2 + 127;

    p[1] = nc;
    p[2] = nc;
    p[3] = nc;

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]);
    return gc;
}

GetRGB返回还包括Alpha通道的颜色值。因此,我只需要更改数组中的每个值并从中创建图像。

我在诺基亚论坛上找到了有用的文件: MIDP 2.0:使用像素和drawRGB()

其他提示

感谢您转换为Greyscale的代码。但是,我注意到,在诺基亚系列40个设备上,此代码运行速度相当缓慢。

有2个优化。主要的是删除GetGrayscale()中的任何对象创建。当前,为每个像素创建一个数组对象。对于QVGA来说,显示为76800个数组对象,这是很多垃圾,可能会调用GC。将INT [4]定义为类中的字段可删除此对象的创建。这里的权衡是班级使用的少量额外RAM。

第二个是将宽度和高度缓存到GetGrayscaleimage()中。在某些设备上,将反复调用getWidth()和getheight()的方法,而无需进行优化(JIT编译器都可以,但没有一些解释的设备)。因此,对于QVGA,getwidth()和getheight()将在它们之间称为> 150000。

总的来说,我发现此修改版本更快地运行:-)

public Image getGrayScaleImage(Image screenshot) {
    int width = getWidth();
    int height = getHeight();
    int screenSizeInPixels = (width * height);

    int[] rgbData = new int[width * height];

    image.getRGB(rgbData, 0, width, 0, 0, width, height);
    for (int x = 0; x < screenSizeInPixels ; x++) {
        rgbData[x] = getGrayScale(rgbData[x]);
    }

    Image grayImage = Image.createRGBImage(rgbData, width, height, true);
    return grayImage;
}

static int[] p = new int[4];
private int getGrayScale(int c) {

    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level
    p[3] = (int) (c & 0x000000FF); // Blue level

    int nc = p[1] / 3 + p[2] / 3 + p[3] / 3;
    // a little bit brighter
    nc = nc / 2 + 127;

    p[1] = nc;
    p[2] = nc;
    p[3] = nc;

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]);
    return gc;
}

(如果您真的不想使用类数据空间,只需用四个可以在堆栈上生存的独立局部INT变量替换INT [])

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top