ページ

2013-02-05

ブログに最適な画像サイズを力技で求めた。あとScalaのコード



大きければ良いという概念が仮定されています。

bloggerで画像を貼り付ける時は小・中・大・特大・元のサイズっていう風に段階的にサイズを選べるのですが、ドールの画像を貼り付けるのに特大だと少し小さくて、元のサイズだと大きすぎてちょっとアレでした。

htmlを直接いじれば任意のサイズで画像を貼り付けられるので、元の画像の比を保ったまま、出来る限り大きくすることにしました。

比率は少数倍になるのですが、求める画像のサイズは整数で欲しかったので、出来る限り整数に近い値を選びました。

そんでもって無駄にコードが書きたくなったので無駄に計算資源を使って、1.2倍から1.5倍の間を0.00001刻みで計算していって、整数表現にした時との誤差が0.01に収まるような値を求めることになりました。

その時のコードが以下になります。

import scala.math._
import scala.language.implicitConversions
// BigDecimalとDoubleをアレする
implicit def bd2d(bd:BigDecimal):Double = bd.doubleValue
// heightとwidthをhiでびよ〜んってする
def biyoon(height: Int)(width: Int)(hi: BigDecimal) = {
(height * hi, width * hi)
}
// 元となる縦横の値を入れとく.
val blogImageSize = biyoon(640)(426) _
// from - toまでstepで刻んだリスト
// doubleでそのままやったら小数点以下がキモくなったので安易にBigDecimalにした
def doubleList(from: BigDecimal, to: BigDecimal, step: BigDecimal) = {
def join(resp:List[BigDecimal]):List[BigDecimal] = {
val next = resp.last + step
if(next >= to) resp else join(resp :+ next)
}
join(List(from))
}
println("(hi, height, width)")
doubleList(1.2, 1.5, 0.00001)
// びよ〜ん
.map( x => (x, blogImageSize(x)))
// widthとheightがerr内に収まっているヤツのみ抽出
.filter{ case(hi, x) =>
val err = 0.01
val withinErrorMargin = (x: Double, err: Double) => math.abs(x - Math.floor(x)) < err
val withinRange = withinErrorMargin(_: Double, err)
withinRange(x._1) && withinRange(x._2)
}
// 読みやすいようにフラットにする
.map{case (x, (y, z)) => (x, y, z)}
.foreach(println)
/*
(hi, height, width)
(1.490630,954.0031999999999,635.00838)
(1.495320,957.0047999999999,637.00632)
*/
view raw Hi.scala hosted with ❤ by GitHub
結果は

(hi, height, width)                  
(1.490630,954.0031999999999,635.00838)
(1.495320,957.0047999999999,637.00632)

ということになったので、どちらも1.49倍といっぱいいっぱいな感じですが、よりいっぱいいっぱいな感じがする1.495320を選びました。

ということで、このブログにドール画像を貼り付ける時の最適な縦横のサイズは957x637となりました。

めでたしめでたし。


0 件のコメント:

コメントを投稿