3

すでに黒いエッジのある画像をダウンロードしています。注:これは、画像のサイズを変更した結果ではありません。GDライブラリを使用してこれらの黒いエッジを検出して削除するにはどうすればよいですか?

ここに画像の説明を入力してください

ここに画像の説明を入力してください

アップデート

これは、スクリプトを使用してトリミングされた画像です ここに画像の説明を入力してください

4

1 に答える 1

5

私はこれに対する時間のかかる修正を思い付くことができました。保存する画像は、これらの黒い境界線で保存する必要がありますか?次のスクリプト(phpを使用してディレクトリ内のすべての画像をループする)を使用して黒い境界線のあるすべての画像を実行し、phpに古い黒い境界線のある画像を新しい境界線のない画像で上書きさせることができればはるかに良いでしょう。

私が採用したアプローチは、4つのループを作成することでした。

  1. 右側の黒い境界線を見るには(xをループ-> yをループ)
  2. 左側の黒い境界線を見るには(xをループ-> yをループ)
  3. 下部の黒い境界線を確認するには(yをループ-> xをループ)
  4. 上部の黒い境界線を確認するには(yをループ-> xをループ)

ここで、これらの各ループには、他の座標(つまり、x->yまたはy->x)をループする別のループが含まれていました。内側のループで、外側のループの線上にあるピクセルの1つが黒ではないことがわかった場合、全体の外観が崩れました。それが見つからなかった場合、それはカウンターに1つ増えます。

最後に、新しいサイズで新しい画像を作成し、新しい画像から古い画像にコピーするだけです。

<?php
$image_path = "jcMHt.jpg";

$jpg = imagecreatefromjpeg($image_path);
$black = array("red" => 0, "green" => 0, "blue" => 0, "alpha" => 0);

$removeLeft = 0;
for($x = 0; $x < imagesx($jpg); $x++) {
    for($y = 0; $y < imagesy($jpg); $y++) {
        if(imagecolorsforindex($jpg, imagecolorat($jpg, $x, $y)) != $black){
            break 2;
        }
    }
    $removeLeft += 1;
}

$removeRight = 0;
for($x = imagesx($jpg)-1; $x > 0; $x--) {
    for($y = 0; $y < imagesy($jpg); $y++) {
        if(imagecolorsforindex($jpg, imagecolorat($jpg, $x, $y)) != $black){
            break 2;
        }
    }
    $removeRight += 1;
}

$removeTop = 0;
for($y = 0; $y < imagesy($jpg); $y++) {
    for($x = 0; $x < imagesx($jpg); $x++) {
        if(imagecolorsforindex($jpg, imagecolorat($jpg, $x, $y)) != $black){
            break 2;
        }
    }
    $removeTop += 1;
}

$removeBottom = 0;
for($y = imagesy($jpg)-1; $y > 0; $y--) {
    for($x = 0; $x < imagesx($jpg); $x++) {
        if(imagecolorsforindex($jpg, imagecolorat($jpg, $x, $y)) != $black){
            break 2;
        }
    }
    $removeBottom += 1;
}

$cropped = imagecreatetruecolor(imagesx($jpg) - ($removeLeft + $removeRight), imagesy($jpg) - ($removeTop + $removeBottom));
imagecopy($cropped, $jpg, 0, 0, $removeLeft, $removeTop, imagesx($cropped), imagesy($cropped));

header("Content-type: image/jpeg");
imagejpeg($cropped); //change to `imagejpeg($cropped, $image_path);` to save
imagedestroy($cropped);
imagedestroy($jpg);
于 2012-10-12T02:10:29.220 に答える