PlayFrameworkで画像をインライン化
リクエスト数課金があるプロダクトを利用するため、CSS Spliteを導入していないWEBサイトの費用が嵩みそうなので、imgタグのsrcをbase64エンコードした画像データに変更してリクエスト数を減らす。
package helpers
import org.apache.commons.codec.binary.Base64
import com.google.common.io.ByteStreams
object AssetObj {
def imageBase64(path: String, ext: String = "png") = {
try {
val url = this.getClass().getClassLoader().getResource(s"public/${path}")
val is = url.openStream()
try {
val arr = ByteStreams.toByteArray()
getBase64(arr, ext)
} finally {
is.close()
}
} catch {
case e: Exception => routes.Assets.at(path).toString
}
}
protected def getBase64(source: Array[Byte], ext: String) = {
val img = new String(Base64.encodeBase64(source))
s"data:image/${ext};base64,${img}"
}
}
viewで下記のように使える。
<img src="@helpers.AssetObj.imageBase64("images/test.png")" alt="test" />