Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对BuffereImage使用IntBuffer_Java_Image_Bufferedimage - Fatal编程技术网

Java 对BuffereImage使用IntBuffer

Java 对BuffereImage使用IntBuffer,java,image,bufferedimage,Java,Image,Bufferedimage,正如标题aleady所说,它希望创建一个由特定(已经存在)IntBuffer支持的BuffereImage 到目前为止,我有以下代码: 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 i

正如标题aleady所说,它希望创建一个由特定(已经存在)IntBuffer支持的BuffereImage

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

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<>());
final IntBuffer buf=。。。;
DataBuffer dbuf=新的DataBuffer(DataBuffer.TYPE_INT,size){
公共无效集合元素(内部银行、内部i、内部val){
buf.put(i,val);
}
公共int getElem(int银行,int i){
返回buf.get(i);
}
};
ColorModel cm=ColorModel.getRGBdefault();
SampleModel sm=cm.createCompatibleSampleModel(尺寸宽度、尺寸高度);
WritableRaster raster=WritableRaster.createWritableRaster(sm、dbuf、null);
BuffereImage img=新的BuffereImage(cm,光栅,false,新哈希表());
但是,此代码显示以下错误:

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)
线程“main”java.awt.image.RasterFormatException中的异常:IntegerComponentTrasters必须具有Integer数据缓冲区 位于sun.awt.image.integerComponentTraster。(未知来源) 在sun.awt.image.IntegerInterleavedRaster。(未知来源) 在sun.awt.image.IntegerInterleavedRaster。(未知来源) 位于java.awt.image.Raster.createWritableRaster(未知源) 位于test.test.main(test.java:100) (该行是创建可写光栅的行。)
数据不必被复制对我来说非常重要,因为我将使用BuffereImage主要作为一个舒适的接口来写入底层IntBuffer(除了一些例外)。

我查看了IntegerComponentTraster的字节码,它抛出了您的异常,并且它显式地检查您传入的
DataBuffer
实例是否是
DataBufferInt
的子类。 不幸的是,您无法轻松扩展这个类,因为它声明为
final
。所以我恐怕你不能做你需要的

或者,您可以先创建
DataBuffer
,然后将其内容包装在
IntBuffer
中?大概是这样的:

DataBufferInt dbuf = new DataBufferInt(size);
IntBuffer buf = IntBuffer.wrap(dbuf.getData());
// Fill the IntBuffer etc...

我遇到了一个非常类似的问题,试图创建一个由nio
ByteBuffer
支持的
DataBuffer
。您正在尝试做的是可能的,但不使用
Raster.createWritableRaster
方法(我认为这是一个bug,但它已经存在很多年了,所以不要期望它很快得到修复)。您需要直接创建可写光栅的实例

要么:

WritableRaster = new sun.awt.image.SunWritableRaster(...);
或者,创建自己的
writeableRaster
子类(这很简单,实际上不需要重写任何方法,除了可能
toString
来帮助调试)

要获得一些灵感,您可以看看我的实现,
本课程学习如何使用它

生成的图像将始终是
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

你是从其他论坛复制的吗?不要将

标记放在每行后面。所以它有自己的格式。我已经尝试过修改你的文章的格式,但请在发布之前阅读任何网站的编辑建议。谢谢你以后在这方面的合作。我试着将其正确格式化,但我的英语不是最好的。所以关于这个主题的帮助文件把我弄糊涂了。不过,谢谢你格式化它。当然,我并没有从任何地方复制它,而是通过尝试和错误来编程。(在违反版权法可能要花费数千欧元的时候,复制和粘贴可能不是一个好主意。)感谢分析IntegerComponentTraster。这对我来说是个坏消息,因为重要的是数据分配在IntBuffer中,而不是在DataBuffer中。我无法直接访问原始数据(int[]),因为它大部分时间直接存储在图形卡中,由第三方库处理。只有使用IntBuffer提供的方法才能写入和读取此数据。
img: BufferedImage@234441b6: type = 0 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 com.twelvemonkeys.image.BufferTest$2@563625d0