Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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
ColorModels和WritableRaster如何在java BuffereImage中工作?_Java_Image_Bufferedimage - Fatal编程技术网

ColorModels和WritableRaster如何在java BuffereImage中工作?

ColorModels和WritableRaster如何在java BuffereImage中工作?,java,image,bufferedimage,Java,Image,Bufferedimage,在Java中使用BuffereImage类时,我通常使用参数为int-width、int-height和int-type的构造函数。不过,对于某个应用程序,我需要一个图像,该图像将使用ARGB顺序中的字节存储颜色数据,但不能以这种方式完成,因为它只有类型_4BYTE_ABGR 我找到了以下解决方案,效果很好: WritableRaster raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height

在Java中使用BuffereImage类时,我通常使用参数为int-width、int-height和int-type的构造函数。不过,对于某个应用程序,我需要一个图像,该图像将使用ARGB顺序中的字节存储颜色数据,但不能以这种方式完成,因为它只有类型_4BYTE_ABGR

我找到了以下解决方案,效果很好:

    WritableRaster raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 4, null);
    ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8,8,8,8}, true, false, ColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
    img = new BufferedImage(colorModel, raster, false, new Hashtable<>());
我不明白为什么会这样

虽然-我知道WritableRaster是保存图片像素数据的数据结构,但我已经丢失了。这两个对象(光栅或颜色模型)中的哪一个确定像素数据的顺序为RGBA?我如何使用ColorModel、WritableRaster、boolean、HashTable构造函数模拟BuffereImage的int、int、int构造函数中的任何类型?

这是一种方法

Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 4, null);
…指定字节顺序的。它隐式地这样做,通过假设4个波段,您希望波段偏移量为0、1、2、3,这对应于RGBA;有关详细信息,请参阅源代码。对于RGB颜色空间,波段0=红色,1=绿色,2=蓝色,3=Alpha

如果需要不同的顺序,可以使用不同的factory方法,例如使用ARGB顺序创建光栅:

Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 
                               width * 4, 4, new int[] {3, 0, 1, 2}, null);
这两种方法都将为您创建PixelInterleavedSampleModel的实例,而正是这个SampleModel真正控制了采样顺序

对于BufferedImageint,int,int构造函数的工作方式,以及如何做类似的事情,我认为最好的方法是自己看看源代码。它基本上是一个大的switch语句,其中对于每个常量类型,它都会创建一个可写光栅和一个类似于上面所述的ColorModel

例如:

ColorModel colorModel = ColorModel.getRGBdefault();
WritableRaster raster = colorModel.createCompatibleWritableRaster(width, height);

new BufferedImage(colorModel, raster, colorModel.isAlpahPremultiplied(), null); 
…将创建类型为_INT_ARGB的图像此反向查找的实际工作方式有点令人讨厌,但它的工作方式…:-。如果BuffereImage中不存在相应的类型,则该类型将为type_CUSTOM 0。

这是方法

Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 4, null);
…指定字节顺序的。它隐式地这样做,通过假设4个波段,您希望波段偏移量为0、1、2、3,这对应于RGBA;有关详细信息,请参阅源代码。对于RGB颜色空间,波段0=红色,1=绿色,2=蓝色,3=Alpha

如果需要不同的顺序,可以使用不同的factory方法,例如使用ARGB顺序创建光栅:

Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 
                               width * 4, 4, new int[] {3, 0, 1, 2}, null);
这两种方法都将为您创建PixelInterleavedSampleModel的实例,而正是这个SampleModel真正控制了采样顺序

对于BufferedImageint,int,int构造函数的工作方式,以及如何做类似的事情,我认为最好的方法是自己看看源代码。它基本上是一个大的switch语句,其中对于每个常量类型,它都会创建一个可写光栅和一个类似于上面所述的ColorModel

例如:

ColorModel colorModel = ColorModel.getRGBdefault();
WritableRaster raster = colorModel.createCompatibleWritableRaster(width, height);

new BufferedImage(colorModel, raster, colorModel.isAlpahPremultiplied(), null); 

…将创建类型为_INT_ARGB的图像此反向查找的实际工作方式有点令人讨厌,但它的工作方式…:-。如果BuffereImage中不存在相应的类型,则该类型将为type_CUSTOM 0。

JavaFX是否存在此类型?@dispree当您可以将上述内容与SwingFXUtils类一起用于JavaFX WriteableImage和Java2D BuffereImage之间的转换时,JavaFX使用完全不同的API。请看和全班同学。哦,还有。。请不要在评论中提出新的、无关的问题:-JavaFX是否存在这种情况?@dispree虽然您可以将上述内容与SwingFXUtils类一起用于JavaFX WriteableImage和Java2D BufferedImage之间的转换,但JavaFX使用的是完全不同的API。请看和全班同学。哦,还有。。请不要在评论中提出新的、无关的问题:-