php - 使用 GD 库从现有图像中去除黑边

标签 php image gd

我正在下载一张已经有黑边的图片。注意:这不是我调整图像大小的结果。如何使用 GD 库检测并去除这些黑边?

enter image description here

enter image description here

更新

这是使用脚本裁剪后的图像 enter image description here

最佳答案

我费时费力地解决了这个问题。正在存储的图像是否需要与那些黑色边框一起存储?如果您可以通过以下脚本运行每个带有黑色边框的图像(使用 php 循环访问目录中的每个图像)并让 php 用新的无边框图像覆盖旧的黑色边框图像,那就更好了。

我采用的方法是创建 4 个循环:

  1. 查看右侧的黑色边框(循环 x -> 循环 y)
  2. 查看左侧的黑色边框(循环 x -> 循环 y)
  3. 查看底部的黑色边框(循环 y -> 循环 x)
  4. 查看顶部的黑色边框(循环 y -> 循环 x)

现在,这些循环中的每一个都有另一个循环,它将循环通过另一个坐标(即 x->y 或 y->x)。如果内循环发现位于外循环线上的像素之一不是黑色,它就会破坏整个外观。如果没有找到,它将向计数器增加一个。

最后,我们只需创建一个具有新尺寸的新图像,然后从新图像复制到旧图像。

<?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);

关于php - 使用 GD 库从现有图像中去除黑边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850834/

相关文章:

php - 从 $_GET/$_POST 获取信息并将其保存到数据库的做法?

php - Joomla 输入表单字段输出

php - Laravel日期未插入数据库表中

c - 图片加载、C语言和GTK

javascript - 如何在浏览器中通过 POST 请求加载外国图片?

javascript - 在javascript(React,Jquery)应用程序上预加载图像,图像加载两次

PHP:检查整数是否在某个区间内

PHP GD图像透视

php - 如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?

php - 使用 codeigniter 裁剪图像