Как прочитать исходный альфа-канал из PNG в J2ME?

#image #image-processing #java-me #png #alpha

#изображение #обработка изображений #java-me #png #альфа

Вопрос:

Я пишу простую игру для J2ME, которая использует изображения PNG с 8-разрядным альфа-каналом. Проблема: не все аппаратные средства поддерживают рендеринг полной альфа-прозрачности. Однако, поскольку моя игра довольно статична по своей природе (вначале «спрайты» размещаются на фоновом изображении в зависимости от текущего размера экрана, и это все), я подумал, что было бы возможно предварительно отобразить эти прозрачные изображения непосредственно на фоне во время инициализации игры и использовать это позже в игре. Я не могу предварительно отобразить их в Photoshop, поскольку их позиции заранее неизвестны.

Но, похоже, нет способа прочитать исходный альфа-канал на устройствах, которые не поддерживают полупрозрачность, поскольку он передискретизируется во время загрузки PNG. Есть ли какая-нибудь библиотека, которая может помочь с этим? Или это хорошая идея хранить альфа-каналы отдельно (например, в виде отдельных 8-разрядных изображений PNG) и применять их вручную?

Спасибо!

Ответ №1:

Изображения PNG также имеют поддержку прозрачности, если вы хотите создать прозрачное изображение, тогда вы прочитали данные RGB вместе с альфа-каналами и обработали альфа

 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;
  

Приведенный выше код показывает, как создать прозрачное изображение и использовать.

Комментарии:

1. Спасибо за ответ. Однако в документах для getRGB() указано «На устройствах, которые не поддерживают альфа-смешивание, альфа-значение будет равно 0xFF для непрозрачных пикселей и 0x00 для всех остальных пикселей». Таким образом, результирующее альфа-значение из getRGB() может быть изменено с учетом количества уровней полупрозрачности, поддерживаемых платформой (Display.numAlphaLevels()). Мне было интересно, есть ли способ прочитать альфа-канал независимо от устройства, предпочтительно простым способом (не знаю, существует ли сторонняя библиотека PNG для J2ME).

Ответ №2:

Я не могу обещать, что это поможет, но вы можете попробовать этот способ чтения альфа-канала, используя стандартные методы из Java util.

 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