From dbb90cdca204022a4cefc2533b9b132fcd499ffc Mon Sep 17 00:00:00 2001 From: Ulrik Guenther Date: Wed, 29 May 2024 16:15:51 +0200 Subject: [PATCH] Image: Replace BufferedImage-based image reading with SCIFIO (WIP) --- .../kotlin/graphics/scenery/utils/Image.kt | 64 +++++++++++++------ 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/graphics/scenery/utils/Image.kt b/src/main/kotlin/graphics/scenery/utils/Image.kt index 666e6886a0..cd4ea80293 100644 --- a/src/main/kotlin/graphics/scenery/utils/Image.kt +++ b/src/main/kotlin/graphics/scenery/utils/Image.kt @@ -1,6 +1,7 @@ package graphics.scenery.utils -import graphics.scenery.volumes.Colormap +import io.scif.SCIFIO +import net.imglib2.img.Img import net.imglib2.type.numeric.NumericType import net.imglib2.type.numeric.integer.UnsignedByteType import net.imglib2.type.numeric.real.FloatType @@ -12,6 +13,9 @@ import org.lwjgl.util.tinyexr.EXRImage import org.lwjgl.util.tinyexr.EXRVersion import org.lwjgl.util.tinyexr.TinyEXR import org.lwjgl.util.tinyexr.TinyEXR.FreeEXRImage +import org.scijava.Context +import org.scijava.io.handle.DataHandleService +import org.scijava.io.location.BytesLocation import java.awt.Color import java.awt.color.ColorSpace import java.awt.geom.AffineTransform @@ -22,7 +26,6 @@ import java.io.InputStream import java.nio.ByteBuffer import java.nio.ByteOrder import java.util.* -import javax.imageio.ImageIO /** * Utility class for reading RGBA images via [BufferedImage]. @@ -34,6 +37,7 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val companion object { protected val logger by lazyLogger() + protected val scifio = SCIFIO() private val StandardAlphaColorModel = ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), @@ -71,6 +75,8 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val val imageData: ByteBuffer val pixels: IntArray val buffer: ByteArray + var width: Int + var height: Int when { extension.lowercase().endsWith("exr") -> { @@ -187,39 +193,59 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val reader.close() pixels = TGAReader.read(buffer, TGAReader.ARGB) - val width = TGAReader.getWidth(buffer) - val height = TGAReader.getHeight(buffer) + width = TGAReader.getWidth(buffer) + height = TGAReader.getHeight(buffer) bi = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) bi.setRGB(0, 0, width, height, pixels, 0, width) } catch (e: IOException) { - Colormap.logger.error("Could not read image from TGA. ${e.message}") + logger.error("Could not read image from TGA. ${e.message}") bi = BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) bi.setRGB(0, 0, 1, 1, intArrayOf(255, 0, 0), 0, 1) + width = 1 + height = 1 } + imageData = bufferedImageToRGBABuffer(bi) } else { - try { - val reader = BufferedInputStream(stream) - bi = ImageIO.read(stream) + imageData = try { + // TODO: Improve this code here + val ctx = Context()//PluginService::class.java, SCIFIOService::class.java, DataHandleService::class.java) + val ds = ctx.getService(DataHandleService::class.java) + val h = ds.create(BytesLocation(stream.readAllBytes())) + val opener = scifio.io().getOpener(h.get()) + logger.info("Opener: $opener") + val img = opener.open(h.get()) as? Img + logger.info("opened $img!") + val reader = scifio.initializer().initializeReader(h.get()) + logger.info("Got reader") + val plane = reader.openPlane(0, 0) + logger.info("Opened plane with ${plane.bytes.size}b!") + val b = ByteBuffer.allocateDirect(plane.bytes.size) + b.put(plane.bytes) + b.flip() + width = plane.lengths[0].toInt() + height = plane.lengths[1].toInt() reader.close() + b } catch (e: IOException) { - Colormap.logger.error("Could not read image: ${e.message}") - bi = BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) - bi.setRGB(0, 0, 1, 1, intArrayOf(255, 0, 0), 0, 1) + logger.error("Could not read image: ${e.message}") + width = 1 + height = 1 + ByteBuffer.wrap(byteArrayOf(127,127,127,0)) } } stream.close() - if(flip) { - // convert to OpenGL UV space - flippedImage = createFlipped(bi) - imageData = bufferedImageToRGBABuffer(flippedImage) - } else { - imageData = bufferedImageToRGBABuffer(bi) - } +// if(flip) { +// // convert to OpenGL UV space +// flippedImage = createFlipped(bi) +// imageData = bufferedImageToRGBABuffer(flippedImage) +// } else { +// imageData = bufferedImageToRGBABuffer(bi) +// } - return Image(imageData, bi.width, bi.height) + return Image(imageData, width, height) } } }