Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image processing PNG输出alpha通道但不输出RGB,JPG输出RGB但不输出alpha_Image Processing_Kotlin_Png_Jpeg_Rgba - Fatal编程技术网

Image processing PNG输出alpha通道但不输出RGB,JPG输出RGB但不输出alpha

Image processing PNG输出alpha通道但不输出RGB,JPG输出RGB但不输出alpha,image-processing,kotlin,png,jpeg,rgba,Image Processing,Kotlin,Png,Jpeg,Rgba,我想把一个PNG文件拆分成4个PNG,3个RGB和一个alpha。当我输入PNG时,alpha通道正确输出,但RGB通道不输出任何内容。如果我输入JPG,RGB通道输出正确,但是alpha失败,因为没有alpha通道可获取 我尝试过使用多个图像,所有的图像都是PNG或JPG,它们都以我描述的方式失败 val original = ImageIO.read(File("images/input.png")) val alpha = BufferedImage(original.width, or

我想把一个PNG文件拆分成4个PNG,3个RGB和一个alpha。当我输入PNG时,alpha通道正确输出,但RGB通道不输出任何内容。如果我输入JPG,RGB通道输出正确,但是alpha失败,因为没有alpha通道可获取

我尝试过使用多个图像,所有的图像都是PNG或JPG,它们都以我描述的方式失败

val original = ImageIO.read(File("images/input.png"))

val alpha = BufferedImage(original.width, original.height, original.type)
val red = BufferedImage(original.width, original.height, original.type)
val green = BufferedImage(original.width, original.height, original.type)
val blue = BufferedImage(original.width, original.height, original.type)

for (y in 0 until original.height) {
    for (x in 0 until original.width) {
        val color = original.getRGB(x,y)

        val a = color  and 0xff000000.toInt()
        val r = color  and 0x00ff0000
        val g = color  and 0x0000ff00
        val b = color  and 0x000000ff

        alpha.setRGB(x,y,a)
        red.setRGB(x,y,r)
        green.setRGB(x,y,g)
        blue.setRGB(x,y,b)

    }
}

ImageIO.write(alpha,"png", File("images/alpha.png"))
ImageIO.write(red,"png", File("images/red.png"))
ImageIO.write(green,"png", File("images/green.png"))
ImageIO.write(blue,"png", File("images/blue.png"))

我希望通过各自的通道单独接收4个输出,但我只接收带有PNG的alpha通道,没有带有JPG的alpha通道。

setRGB
使用
TYPE_INT_ARGB
作为颜色模型。当您的位掩码将alpha通道设置为0时,图像显示为空。将要显示的图像的alpha设置为ff

val a = color and 0xff000000.toInt()
val r = (color and 0x00ff0000) or 0xff000000.toInt()
val g = (color and 0x0000ff00) or 0xff000000.toInt()
val b = (color and 0x000000ff) or 0xff000000.toInt() 

JPEG文件格式不包含任何alpha通道-您可以使用JPEG重新创建某种透明度,方法是添加另一个由单色图像组成的层,然后通过该层过滤图像,但这是一个非常特殊的用例,在本例中很可能不需要执行任何操作。

您编写代码的原因是什么无法按预期工作,部分原因是您基于原始类型创建了新的
buffereImage
s:

BufferedImage(original.width, original.height, original.type)
原始类型将根据输入图像的不同而变化。对于JPEG,它通常是
类型\u 3BYTE\u BGR
(没有alpha)。对于PNG,它取决于类型或PNG(灰度、调色板、真彩色、带或不带alpha等)。您输入的PNG似乎是alpha的真彩色,可能导致
TYPE\u 4BYTE\u ABGR
TYPE\u INT\u ARGB

相反,您可以使用
TYPE\u BYTE\u GRAY
创建4个灰度图像(仅“级别”),或者像您现在所做的那样,使用
TYPE\u INT\u ARGB
创建4个ARGB图像(如果我的Kotlin语法关闭,很抱歉,这些天我主要编程Java):

接下来,正如@AlexanderEgger已经指出的,
set/getRGB
方法以打包的ARGB格式运行,因此您需要确保颜色不透明(
仅使用颜色遮罩,将产生完全透明的颜色):

或者,如果您喜欢levels方法,请按照@MarkSetchell的建议执行,并创建所有灰色图像(同样,Kotlin语法可能有点不正确):

vala=(颜色>>24)和0xff
val r=(颜色>>16)和0xff
val g=(颜色>>8)和0xff
val b=颜色和0xff

val aa=0xff000000.toInt()或(a我对Kotlin一无所知,但您可能希望
val g=(color和0x0000ff00)>>8
BufferedImage(original.width, original.height, BufferedImage.TYPE_INT_ARGB)
val a = color and 0xff000000.toInt()
val r = (color and 0x00ff0000) or 0xff000000.toInt()
val g = (color and 0x0000ff00) or 0xff000000.toInt()
val b = (color and 0x000000ff) or 0xff000000.toInt()  
BufferedImage(original.width, original.height, BufferedImage.TYPE_BYTE_GRAY)
val a = (color >> 24) and 0xff
val r = (color >> 16) and 0xff
val g = (color >>  8) and 0xff
val b =  color        and 0xff

val aa = 0xff000000.toInt() or (a << 16) or (a << 8) or a
val rr = 0xff000000.toInt() or (r << 16) or (r << 8) or r
val gg = 0xff000000.toInt() or (g << 16) or (g << 8) or g
val bb = 0xff000000.toInt() or (b << 16) or (b << 8) or b