*/ ini_set("memory_limit", "200M"); set_time_limit(1000); if ($_FILES["hoge"]) { $remove = (int)$_POST["remove"]; if ($remove < 1 || $remove > 300) { exit; } move_uploaded_file($_FILES["hoge"]["tmp_name"], "./hoge1.png"); chmod ("./hoge1.png", 0777); $pixel_list = array(); $energy_list = array(); $m_list = array(); createPixelList("./hoge1.png"); $max_x = count($pixel_list[0]); $max_y = count($pixel_list); createEnergyList(); createMList(); for ($i = 0; $i < $remove; $i++) { $seam = getSeam(); removeSeam($seam); } createImage(); } function createPixelList($file) { global $pixel_list; $info = getimagesize($file); switch ($info[2]) { case IMAGETYPE_GIF: $im = imagecreatefromgif($file); break; case IMAGETYPE_JPEG: $im = imagecreatefromjpeg($file); break; case IMAGETYPE_PNG: $im = imagecreatefrompng($file); break; default: exit; } $max = 640; $im = imagecreatefromjpeg($file); if ($info[0] > $max || $info[1] > $max) { if ($info[0] > $info[1]) { $width = $max; $height = $max * $info[1] / $info[0]; } else { $width = $max * $info[0] / $info[1]; $height = $max; } $new_im = imagecreatetruecolor($width, $height); if (!imagecopyresampled($new_im, $im, 0,0,0,0, $width, $height, $info[0], $info[1])) { exit; } imagedestroy($im); imagejpeg($new_im, "./hoge1.png"); $im =& $new_im; } $x = imagesx($im); $y = imagesy($im); for ($i = 0; $i < $x; $i++) { for ($j = 0; $j < $y; $j++) { $pixel_list[$j][$i] = imagecolorat($im, $i, $j); } } imagedestroy($im); } function createEnergyList() { global $energy_list, $max_x, $max_y; for ($i = 0; $i < $max_x; $i++) { for ($j = 0; $j < $max_y; $j++) { $energy_list[$j][$i] = energy($i, $j); } } } function createMList() { global $m_list, $energy_list, $max_x, $max_y; for ($j = 0; $j < $max_x; $j++) { $m_list[0][$j] = $energy_list[0][$j]; } for ($i = 1; $i < $max_y; $i++) { $m_list[$i][0] = $energy_list[$i][0] + min($m_list[$i-1][0], $m_list[$i-1][1]); for ($j = 1; $j < $max_x - 1; $j++) { $m_list[$i][$j] = $energy_list[$i][$j] + min($m_list[$i-1][$j-1], $m_list[$i-1][$j], $m_list[$i-1][$j+1]); } $m_list[$i][$max_x-1] = $energy_list[$i][$max_x-1] + min($m_list[$i-1][$max_x-2], $m_list[$i-1][$max_x-1]); } } function getSeam() { global $m_list, $energy_list, $max_x, $max_y; $i = $max_y - 1; $seam_list[$i] = 0; $min_last_m = $m_list[$i][0]; for ($j = 0; $j < $max_x; $j++) { if ($min_last_m > $m_list[$i][$j]) { $seam_list[$i] = $j; $min_last_m = $m_list[$i][$j]; } } for ($i = $max_y - 2; $i >= 0; $i--) { $j = $seam_list[$i+1]; $m = $m_list[$i+1][$j]; $pre_m = $m - $energy_list[$i+1][$j]; if ($pre_m == $m_list[$i][$j]) { $seam_list[$i] = $j; } else if ($pre_m == $m_list[$i][$j-1]) { $seam_list[$i] = $j - 1; } else if ($pre_m == $m_list[$i][$j+1]) { $seam_list[$i] = $j + 1; } else { echo "
";      echo "error i:$i, j:$j, m:$m, pre_m:$pre_m \n\n\n";      print_r($seam_list);      exit;
    }
  }
  return $seam_list;
}
  
function removeSeam($seam) {
  global $m_list, $pixel_list, $energy_list, $max_x, $max_y;
  for ($i = 0; $i < $max_y; $i ++) {
    $delete_x = $seam[$i];
    for ($j = $delete_x; $j < $max_x - 1; $j++) {
      $pixel_list[$i][$j] = $pixel_list[$i][$j+1];
      $energy_list[$i][$j] = $energy_list[$i][$j+1];
      $m_list[$i][$j] = $m_list[$i][$j+1];
    }
    unset($pixel_list[$i][$max_x-1]);
    unset($energy_list[$i][$max_x-1]);
    unset($m_list[$i][$max_x-1]);
  }
  for ($i = 0; $i < $max_y; $i ++) {
    $delete_x = $seam[$i];
    if ($delete_x) {
      $energy_list[$i][$delete_x-1] = energy($delete_x - 1, $i);
    }
    if ($delete_x != ($max_x - 1)) {
      $energy_list[$i][$delete_x] = energy($delete_x, $i);
    }
  }
  $from = max(0, $seam[0] - 2);
  $to = min($max_x - 1, $seam[0] + 2);
  $i = 0;
  $delete_x = $seam[$i];
  if ($delete_x) {
  $m_list[$i][$delete_x-1] = $energy_list[$i][$delete_x-1];
  }
  if ($delete_x != ($max_x - 1)) {
  $m_list[$i][$delete_x] = $energy_list[$i][$delete_x];
  }
  for ($i = 1; $i < $max_y; $i ++) {
    for ($j = $from; $j < $to; $j ++) {
      if ($j == 0) {
        $m_list[$i][$j] = $energy_list[$i][$j] + min($m_list[$i-1][$j], $m_list[$i-1][$j+1]);
      } else if ($j == ($max_x - 2)) {
        $m_list[$i][$j] = $energy_list[$i][$j] + min($m_list[$i-1][$j-1], $m_list[$i-1][$j]);
      } else {
        $m_list[$i][$j] = $energy_list[$i][$j] + min($m_list[$i-1][$j-1], $m_list[$i-1][$j], $m_list[$i-1][$j+1]);
      }
    }
    $from = max(0, $from - 1);
    $to = min($max_x - 1, $to + 1);
  }
  
  $max_x --;
}
  
function energy($x, $y) {
  global $pixel_list;
  
  $now_rgb = $pixel_list[$y][$x];
  if (isset($pixel_list[$y][$x-1])) {
    $pre_rgb = $pixel_list[$y][$x-1];
  
    $dx[] = sqrt(pow((($pre_rgb >> 16) & 0xFF) - (($now_rgb >> 16) & 0xFF), 2) +
          pow((($pre_rgb >> 8) & 0xFF) - (($now_rgb >> 8) & 0xFF), 2) +
          pow((($pre_rgb) & 0xFF) - (($now_rgb) & 0xFF), 2));
  }
  if (isset($pixel_list[$y][$x+1])) {
    $pre_rgb = $pixel_list[$y][$x+1];

    $dx[] = sqrt(pow((($pre_rgb >> 16) & 0xFF) - (($now_rgb >> 16) & 0xFF), 2) +
          pow((($pre_rgb >> 8) & 0xFF) - (($now_rgb >> 8) & 0xFF), 2) +
          pow((($pre_rgb) & 0xFF) - (($now_rgb) & 0xFF), 2));
  }
  $dx = array_sum($dx) / count($dx);

  if (isset($pixel_list[$y-1][$x])) {
    $pre_rgb = $pixel_list[$y-1][$x];
    $dy[] = sqrt(pow((($pre_rgb >> 16) & 0xFF) - (($now_rgb >> 16) & 0xFF), 2) +
          pow((($pre_rgb >> 8) & 0xFF) - (($now_rgb >> 8) & 0xFF), 2) +
          pow((($pre_rgb) & 0xFF) - (($now_rgb) & 0xFF), 2));
  }
  if (isset($pixel_list[$y+1][$x])) {
    $pre_rgb = $pixel_list[$y+1][$x];
    $dy[] = sqrt(pow((($pre_rgb >> 16) & 0xFF) - (($now_rgb >> 16) & 0xFF), 2) +
          pow((($pre_rgb >> 8) & 0xFF) - (($now_rgb >> 8) & 0xFF), 2) +
          pow((($pre_rgb) & 0xFF) - (($now_rgb) & 0xFF), 2));
  }
  $dy = array_sum($dy) / count($dy);

  return intval($dx + $dy);
}

function createImage() {
  global $max_x, $max_y, $pixel_list;
  $im = imagecreatetruecolor($max_x, $max_y);
  for ($i = 0; $i < $max_y; $i ++) {
    for ($j = 0; $j < $max_x; $j ++) {
      $rgb = $pixel_list[$i][$j];
      imagesetpixel($im, $j, $i, imagecolorallocate($im, $rgb >> 16 & 0xFF, $rgb >> 8 & 0xFF, $rgb & 0xFF));
    }
  }
  imagejpeg($im, "./hogera1.png");
  chmod("./hogera1.png", 0777);
}

?>




Seam Carving


Seam Carving

Pictures:
Delete Pixel (Vertical)

結果