[英]From image to BufferedImage to image
我正在尝试使用ImageIO.read
读取 256x256 图像,将其转换为ByteArray
,然后转换为BufferedImage
,然后使用ImageIO.write
返回图像文件。 一切似乎都可以正常工作,但是最终图像已损坏(尽管显然仍基于原始图像。我在此过程中找不到问题所在,我怀疑scansize
参数,但我没有完全明白。
这个想法是在读取和写入之间操纵像素,但目前我什至无法将原始图像重新创建回自身。
我在下面附上原始图像和处理后的图像:
import java.awt.image.BufferedImage
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.IOException
import javax.imageio.ImageIO
fun main(args: Array<String>) {
val bImage = ImageIO.read(File("original.tiff"))
val bos = ByteArrayOutputStream()
ImageIO.write(bImage, "tiff", bos)
val data = bos.toByteArray()
val width = 256
val height = 256
val bytesPerPixel = 3
val len = width * height * bytesPerPixel
val image = BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
val arr = IntArray(len)
for (i in 0 until len) arr[i] = data.get(i).toInt()
image.setRGB(0, 0, width, height, arr, 0, 256) // Seems like something is wrong here
try {
ImageIO.write(image, "jpg", File("converted-grayscale-002.jpg"))
} catch (e: IOException) {
System.err.println("IOException: $e")
}
}
此行不返回 RGB 图像数据:
val 数据 = bos.toByteArray()
它以 tiff 格式返回图像的压缩 stream,肯定不是正确的图像。
要获取像素,请使用 Image.getPixel(),或者您可以直接获取图像的缓冲区,但为此您需要知道底层缓冲区类型是什么 - 这是一个广泛的主题。
看看这个答案,它应该让你知道如何做到这一点: 将 RGB 图像转换为灰度图像减少 java 中的 memory
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.