ColorModels和WritableRaster如何在java BuffereImage中工作?
在Java中使用BuffereImage类时,我通常使用参数为int-width、int-height和int-type的构造函数。不过,对于某个应用程序,我需要一个图像,该图像将使用ARGB顺序中的字节存储颜色数据,但不能以这种方式完成,因为它只有类型_4BYTE_ABGR 我找到了以下解决方案,效果很好: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
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。请看和全班同学。哦,还有。。请不要在评论中提出新的、无关的问题:-