*/ 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