-
Notifications
You must be signed in to change notification settings - Fork 0
/
DoMosaic.scala
96 lines (70 loc) · 3.12 KB
/
DoMosaic.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.oct.sclaav.visual.assembly.mosaic
import java.io.File
import com.oct.sclaav.visual.assembly.grid.SimpleCompleteGridAssembler
import com.oct.sclaav.visual.manipulators._
import com.oct.sclaav.visual.search.MatchByArgbAverage
import com.sksamuel.scrimage.nio.JpegWriter
import com.sksamuel.scrimage.{Color, Image, ScaleMethod}
import org.slf4j.LoggerFactory
import scala.collection.parallel.mutable.ParArray
object DoMosaic {
val log = LoggerFactory.getLogger(getClass)
implicit val writer = JpegWriter.Default
def compose(rows: Int, cols: Int, allImages: Array[Image], controlImage: Image, controlSize: (Int, Int)): Image = {
val listBuffer = new ParArray[(Image, (Int, Int))](rows * cols)
log.info(s"cropping and matching using sample size ${allImages.length}")
for (c <- (0 to cols - 1).par) {
log.info(s"${c + 1} of $cols cols complete")
for(r <- 0 to rows - 1) {
val cropped = SimpleCrop((cols, rows), (c, r), controlImage)
val matchToCropped = MatchByArgbAverage(cropped, allImages)
listBuffer.update(rows*c + r, (matchToCropped, (c, r)))
}
}
val transparentCanvas = Image.filled(controlSize._1, controlSize._2, Color.Transparent)
log.info("assembling")
val assembledImage = SimpleCompleteGridAssembler(transparentCanvas,listBuffer.seq.toArray , (cols, rows))
assembledImage
}
def apply(
controlFile: File,
sampleFiles: Array[File],
cols: Int,
rows: Int,
outPath: Option[File] = None,
outputFilename: Option[String] = None,
doManipulate: Boolean = false,
writeReferenceImg: Boolean = false): Image = {
val controlImage = Image.fromFile(controlFile)
val controlSize = (controlImage.width, controlImage.height)
val colWidth = controlSize._1 / cols
val rowHeight = controlSize._2 / rows
log.info(s"loading ${sampleFiles.length} images")
val images = sampleFiles.map(f => Image.fromFile(f).scaleTo(colWidth, rowHeight, ScaleMethod.FastScale))
val allImages = doManipulate match {
case false => images
case true =>
log.info(s"doing manipulations")
val manips = Array(SummerManipulator, DiffuseManipulator, GlowManipulator, ChromeManipulator, OilManipulator, EdgeManipulator, LensBlurManipulator) //LensBlurManipulator
val manipped = ManipulateAllWithAllOnce(images, manips)
images.++(manipped)
}
val assembledImage = compose(rows, cols, allImages, controlImage, controlSize)
log.info("persisting")
val controlFilePhotoName = controlFile.getPath.split("/").last
outPath match {
case Some(outPathFile) =>
if (writeReferenceImg) {
val refPath = new File(outPathFile, s"${controlFilePhotoName}_ref.jpeg")
controlImage.output(refPath)
}
val assembledPath = outputFilename match {
case None => new File(outPathFile, s"${controlFilePhotoName}_assembled.jpeg")
case Some(name) => new File(outPathFile, s"${name}")
}
assembledImage.output(assembledPath)
case None =>
}
assembledImage
}
}