Skip to content

Commit

Permalink
Image: Replace BufferedImage-based image reading with SCIFIO (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
skalarproduktraum committed May 29, 2024
1 parent 881bd25 commit dbb90cd
Showing 1 changed file with 45 additions and 19 deletions.
64 changes: 45 additions & 19 deletions src/main/kotlin/graphics/scenery/utils/Image.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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].
Expand All @@ -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),
Expand Down Expand Up @@ -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") -> {
Expand Down Expand Up @@ -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<UnsignedByteType>
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)
}
}
}
Expand Down

0 comments on commit dbb90cd

Please sign in to comment.