Skip to content

Instantly share code, notes, and snippets.

@iszlai
Created December 13, 2014 20:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iszlai/c09e8b836d8b313d616d to your computer and use it in GitHub Desktop.
Save iszlai/c09e8b836d8b313d616d to your computer and use it in GitHub Desktop.
Akka ETL load a folder full of images and save int arrrays to file line by line
package com.strike.etl
import java.io.FileWriter
import akka.actor.Actor
import com.typesafe.config.ConfigFactory
import org.slf4j.LoggerFactory
/**
* Created by Lehel on 12/13/2014.
*/
class FileAppendingActor extends Actor {
def logger = LoggerFactory.getLogger(this.getClass)
val conf = ConfigFactory.load()
val RESULTFILE=conf.getString("saveToURL")
val fw = new FileWriter(RESULTFILE, true)
logger.info("FileAppenderWorker created")
def receive = {
case TextToAppend(message) => {
logger.trace(s"received:{$message}")
fw.write(message + System.lineSeparator)
}
}
override def postStop() = {
super.postStop()
fw.close()
logger.info("FileAppenderWorker shutting down, resultData.csv closed")
}
}
package com.strike.etl
import java.awt.image.BufferedImage
import akka.actor.{ActorRef, Actor}
import org.slf4j.LoggerFactory
/**
* Created by Lehel on 12/13/2014.
*/
case class ImageToProcess(img: BufferedImage)
case class TextToAppend(line: String)
class ImageMappingActor(fileAppender: ActorRef) extends Actor {
def logger = LoggerFactory.getLogger(this.getClass)
def extractString(img: BufferedImage): String = {
val height = img.getHeight;
val width = img.getWidth;
val arr = img.getRGB(0, 0, width, height, null, 0, width);
arr.mkString(",")
}
def receive = {
case ImageToProcess(message) => {
val result = extractString(message)
fileAppender ! new TextToAppend(result)
logger.trace("msg extracted: " + result)
}
}
}
package com.strike.etl
import java.awt.FlowLayout
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
import javax.swing.{JLabel, JFrame, ImageIcon}
import akka.actor.{Inbox, Props, ActorSystem}
import com.typesafe.config.ConfigFactory
import org.slf4j.LoggerFactory
/**
* Created by Lehel on 12/12/2014.
*/
object LoadImages {
def main(args: Array[String]) {
def logger = LoggerFactory.getLogger(this.getClass)
val conf = ConfigFactory.load()
val loadURL=conf.getString("loadFromURL")
logger.info("Startup")
// Create the 'helloakka' actor system
val system = ActorSystem("actorSystem")
val fileAppendingActor = system.actorOf(Props[FileAppendingActor], "fileAppendingActor")
val imageMapperWorker = system.actorOf(Props(new ImageMappingActor(fileAppendingActor)))
// Create an "actor-in-a-box"
val inbox = Inbox.create(system)
var nrOfFile = 0;
for (file <- new File(loadURL).listFiles) {
logger.info("read in:" + file.getName)
val img = ImageIO.read(file)
inbox.send(imageMapperWorker, new ImageToProcess(img))
nrOfFile += 1
}
logger.info(s"Processed $nrOfFile nr.files")
system.shutdown()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment