gpt4 book ai didi

java - 对 BufferedImage 使用 IntBuffer

转载 作者:行者123 更新时间:2023-11-30 09:15:15 25 4
gpt4 key购买 nike

正如标题所说,它想要创建一个由特定(已经存在的)IntBuffer 支持的 BufferedImage。

到目前为止,我有以下代码:

final IntBuffer buf = ...;
DataBuffer dbuf = new DataBuffer(DataBuffer.TYPE_INT,size) {
public void setElem(int bank, int i, int val) {
buf.put(i,val);
}
public int getElem(int bank, int i) {
return buf.get(i);
}
};
ColorModel cm = ColorModel.getRGBdefault();
SampleModel sm = cm.createCompatibleSampleModel(dim.width,dim.height);
WritableRaster raster = WritableRaster.createWritableRaster(sm,dbuf,null);
BufferedImage img = new BufferedImage(cm,raster,false,new Hashtable<>());

但是此代码显示以下错误:

Exception in thread "main" java.awt.image.RasterFormatException: IntegerComponentRasters must haveinteger DataBuffers
at sun.awt.image.IntegerComponentRaster.<init>(Unknown Source)
at sun.awt.image.IntegerInterleavedRaster.<init>(Unknown Source)
at sun.awt.image.IntegerInterleavedRaster.<init>(Unknown Source)
at java.awt.image.Raster.createWritableRaster(Unknown Source)
at test.Test.main(Test.java:100)

(该行是创建 WritableRaster 的行。)不必复制数据对我来说非常重要,因为我将主要使用 BufferedImage 作为写入底层 IntBuffer 的舒适接口(interface)(除了少数异常(exception))。

最佳答案

我有一个非常相似的问题,试图创建一个 DataBuffer由 nio 支持 ByteBuffer .你想做的是可能的,但不使用 Raster.createWritableRaster方法(我认为这是一个错误,但它已经存在了很长时间,所以不要指望它会很快被修复)。您需要直接创建可写栅格的实例。

或者:

WritableRaster = new sun.awt.image.SunWritableRaster(...);

或者,创建您自己的 WritableRaster 的子类(这很简单,您实际上不需要重写任何方法,除了 toString 以帮助调试)。

class GenericWritableRaster extends WritableRaster {
public GenericWritableRaster(SampleModel model, DataBuffer buffer, Point origin) {
super(model, buffer, origin);
}
}

WritableRaster = new GenericWritableRaster(...);

想要一些灵感,你可以看看我的GenericWritableRaster实现,以及
MappedImageFactory有关如何使用它的类(class)。

生成的图像将始终为 BufferedImage.TYPE_CUSTOM 类型(因此可能从 Java 开始变慢),但如果您有一个已经将图像保存在图形卡 RAM 中的库,这对您来说可能不是问题。


更新,这是基于您的代码的 SSCCE PoC:

public class BufferTest {
public static void main(String[] args) {
Dimension dim = new Dimension(100, 100);
int size = dim.width * dim.height;

final IntBuffer buf = IntBuffer.wrap(new int[size]);

DataBuffer dbuf = new DataBuffer(DataBuffer.TYPE_INT, size) {
public void setElem(int bank, int i, int val) {
buf.put(i, val);
}

public int getElem(int bank, int i) {
return buf.get(i);
}
};
ColorModel cm = ColorModel.getRGBdefault();
SampleModel sm = cm.createCompatibleSampleModel(dim.width, dim.height);
WritableRaster raster = new WritableRaster(sm, dbuf, new Point()) {};
BufferedImage img = new BufferedImage(cm, raster, false, null);

System.err.println("img: " + img);
}
}

打印:

img: BufferedImage@234441b6: type = 0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 com.twelvemonkeys.image.BufferTest$2@563625d0

关于java - 对 BufferedImage 使用 IntBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com