繁体   English   中英

从图像到 BufferedImage 到图像

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM