【问题标题】:How to read the original alpha channel from PNG in J2ME?如何在 J2ME 中从 PNG 读取原始 alpha 通道?
【发布时间】:2011-08-22 18:57:01
【问题描述】:

我正在编写一个简单的 J2ME 游戏,它使用带有 8 位 alpha 通道的 PNG 图像。问题:并非所有硬件都支持完整的 alpha 透明度渲染。然而,由于我的游戏本质上是相当静态的(一开始,“精灵”根据当前的屏幕尺寸布置在背景图像上,仅此而已),我认为可以将这些透明图像直接预渲染到游戏初始化期间的背景,并在游戏后期使用。我无法在 Photoshop 中预渲染它们,因为它们的位置事先不知道。

但是,似乎无法在不支持半透明的设备上读取原始 Alpha 通道,因为它在 PNG 加载期间会被重新采样。有没有一些图书馆可以帮助解决这个问题?还是单独存储 Alpha 通道(例如,作为单独的 8 位 PNG 图像)并手动应用它们是个好主意?

谢谢!

【问题讨论】:

    标签: image image-processing java-me png alpha


    【解决方案1】:

    如果您想创建透明图像,PNG 图像也具有透明度支持,那么您已经读取了 RGB 数据以及 alpha 通道并处理了 alpha

    Image transPNG=Image.createImage("/trans.png");  //load the tranparent image
    int rgbData[];
    transPNG.getRGB(rgbData, 0,transPNG.getWidth(), 0, 0,transPNG.getWidth(), transPNG.getHeight());
    Image tranparentImage=Image.createRGBImage(rgbData, width, height, true); //process alpha
    transPNG=null;
    

    以上代码展示了如何创建和使用透明图片。

    【讨论】:

    • 感谢您的回复。但是,getRGB() 的文档指出“在不支持 alpha 混合的设备上,不透明像素的 alpha 值为 0xFF,所有其他像素的 alpha 值为 0x00。”因此,可以修改 getRGB() 生成的 alpha 值以适应平台支持的半透明级别数 (Display.numAlphaLevels())。我想知道是否有办法以独立于设备的方式读取 alpha 通道,最好以简单的方式(但不知道是否有用于 J2ME 的第 3 方 PNG 库)。
    【解决方案2】:

    我不能保证这会有所帮助,但您可以尝试使用 Java util 中的标准方法读取 Alpha 通道。

    BufferedImage image = ImageIO.read(new File(name));
    
    int[] alpha = new int[1]; //containg alpha-value for one pixel.
    image.getAlphaRaster().getPixel(x, y, alpha);
    
    System.out.println(alpha[0]); //gives the alpha value for x,y 
    

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 2019-03-18
      • 2011-10-29
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多