mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Adding extraction primitives
This commit is contained in:
@ -0,0 +1,7 @@
|
||||
package docspell.files
|
||||
|
||||
case class Dimension(width: Int, height: Int) {
|
||||
|
||||
def toAwtDimension: java.awt.Dimension =
|
||||
new java.awt.Dimension(width, height)
|
||||
}
|
61
modules/files/src/main/scala/docspell/files/ImageSize.scala
Normal file
61
modules/files/src/main/scala/docspell/files/ImageSize.scala
Normal file
@ -0,0 +1,61 @@
|
||||
package docspell.files
|
||||
|
||||
import java.io.{ByteArrayInputStream, InputStream}
|
||||
import java.nio.file.Path
|
||||
|
||||
import cats.implicits._
|
||||
import cats.effect._
|
||||
import fs2.Stream
|
||||
import javax.imageio.stream.{FileImageInputStream, ImageInputStream}
|
||||
import javax.imageio.{ImageIO, ImageReader}
|
||||
|
||||
import scala.jdk.CollectionConverters._
|
||||
import scala.util.{Try, Using}
|
||||
|
||||
object ImageSize {
|
||||
|
||||
/** Return the image size from its header without reading
|
||||
* the whole image into memory.
|
||||
*/
|
||||
def get(file: Path): Option[Dimension] =
|
||||
Using(new FileImageInputStream(file.toFile))(getDimension).toOption.flatten
|
||||
|
||||
/** Return the image size from its header without reading
|
||||
* the whole image into memory.
|
||||
*/
|
||||
def get(in: InputStream): Option[Dimension] =
|
||||
Option(ImageIO.createImageInputStream(in)).flatMap(getDimension)
|
||||
|
||||
/** Return the image size from its header without reading
|
||||
* the whole image into memory.
|
||||
*/
|
||||
def get[F[_]: Sync](data: Stream[F, Byte]): F[Option[Dimension]] = {
|
||||
data.take(768).compile.to(Array).map(ar => {
|
||||
val iis = ImageIO.createImageInputStream(new ByteArrayInputStream(ar))
|
||||
if (iis == null) sys.error("no reader given for the array")
|
||||
else getDimension(iis)
|
||||
})
|
||||
}
|
||||
|
||||
private def getDimension(in: ImageInputStream): Option[Dimension] =
|
||||
ImageIO
|
||||
.getImageReaders(in)
|
||||
.asScala
|
||||
.to(LazyList)
|
||||
.collectFirst(Function.unlift { reader =>
|
||||
val dim = getDimension(in, reader).toOption
|
||||
reader.dispose()
|
||||
dim
|
||||
})
|
||||
|
||||
private def getDimension(
|
||||
in: ImageInputStream,
|
||||
reader: ImageReader
|
||||
): Either[Throwable, Dimension] =
|
||||
Try {
|
||||
reader.setInput(in)
|
||||
val width = reader.getWidth(reader.getMinIndex)
|
||||
val height = reader.getHeight(reader.getMinIndex)
|
||||
Dimension(width, height)
|
||||
}.toEither
|
||||
}
|
Reference in New Issue
Block a user