#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