Preview 用に画像を crop & scale する

Date
2007-09-05 (Wed)
Category
Processing

画像を受け取って、それからPreview 用の Thumbnail を生成する、というのは Web app でよくあるシチュエーションだと思います。自分用の備忘録として、今日思いついた方法をメモしておきます。

変換元 / 変換先がどんな画像であれ、crop & scale に必要な情報は

この8つです。今回はこの8つのうち、4つの情報、変換元 / 変換先それぞれの幅と高さがわかっている状態から、出来るだけ、aspect 比を変えないようにするアルゴリズムを考えてみました。PHP で手続き風に書きますが、言語(当然ですが)は問いません。

function calcResizedBounds ($w0, $h0, $w1, $h1)
{
  switch (true)
  {
    case ($w0 > $h0):
      $r = processLandscape($w0, $h0, $w1, $h1);
    break;
case ($w0 < $h0): $r = processPortrait($w0, $h0, $w1, $h1); break;
case ($w0 == $h0): $r = processSquare($w0, $w1, $h1); break; } return $r; }
function processLandscape ($w0, $h0, $w1, $h1) { $src_y = 0; $src_h = $h0; $ratio = $h0 / $h1; $src_w = floor($w1 * $ratio); $src_x = floor(($w0 - $src_w) / 2); return array($src_x, $src_y, $src_w, $src_h); }
function processPortrait ($w0, $h0, $w1, $h1) { $src_x = 0; $src_w = $w0; $ratio = $w0 / $w1; $src_h = floor($h1 * $ratio); $src_y = floor(($h0 - $src_w) / 2); return array($src_x, $src_y, $src_w, $src_h); }
function processSquare ($side, $w1, $h1) { switch (true) { case ($w1 > $h1): $src_x = 0; $src_w = $side; $ratio = $side / $w1; $src_h = floor($h1 * $ratio); $src_y = floor(($side - $src_w) / 2); break;
case ($w1 < $h1): $src_y = 0; $src_h = $side; $ratio = $side / $h1; $src_w = floor($w1 * $ratio); $src_x = floor(($side - $src_w) / 2); break;
case ($w1 == $h1): $src_x = 0; $src_y = 0; $src_w = $side; $src_h = $side; break; } return array($src_x, $src_y, $src_w, $src_h); }

こんな風に使います。

$dst_x = 0;
$dst_y = 0;
$dst_w = $w1;
$dst_h = $h1;
$src_x = null;
$src_y = null;
$src_w = null;
$src_h = null;
list($src_x, $src_y, $src_w, $src_h) = calcResizedBounds($w0, $h0, $w1, $h1);

Comment:0

Comment Form

Remember Me?


Trackback:0

TrackBack URL for this entry
http://blogs.grf-design.com/mt/mt-tb.cgi/234
Listed below are links to weblogs that reference
Preview 用に画像を crop & scale する from The Croton

Return to Page Top