Я использовал приведенное выше решение Рона, но цвета изображения при применении в качестве текстуры были неправильными, что означает, что принятое решение, вероятно, не даст одинаковых результатов для всех видов изображений.
Попыткаисправить проблему с цветом, я попытался использовать ColorModel
оригинала BufferedImage
, к которому можно обратиться, вызвав BufferedImage#getColorModel
.Но это дало мне исключение, что ColorModel
исходного изображения несовместимо с объектом WritableRaster
.
Я искал решение для этого и нашел этот один.Вместо вызова Raster.createInterleavedRaster
для создания WritableRaster
я использовал ColorModel#createCompatibleWritableRaster
.
Надеюсь, это поможет.Вот код:
public static ByteBuffer load(BufferedImage bufferedImage) {
WritableRaster raster = bufferedImage.getColorModel().createCompatibleWritableRaster
(bufferedImage.getWidth(), bufferedImage.getHeight());
BufferedImage textureImage = new BufferedImage(bufferedImage.getColorModel(), raster,
true, new Hashtable<>());
Graphics graphics = textureImage.getGraphics();
graphics.setColor(new Color(0, 0, 0));
graphics.fillRect(0, 0, 256, 256);
graphics.drawImage(bufferedImage, 0, 0, null);
byte[] data = ((DataBufferByte) textureImage.getRaster().getDataBuffer()).getData();
ByteBuffer imageBuffer = ByteBuffer.allocate(data.length);
imageBuffer.order(ByteOrder.nativeOrder());
imageBuffer.put(data, 0, data.length);
imageBuffer.flip();
return imageBuffer;
}