PHP用于检测不透明的PNG区域的方法

时间:2014-05-14 20:24:34

标签: javascript php

我希望转换已经编写的Javascript函数来检测图像的非透明区域。

The initial question and answer is here.

迭代很容易转换为PHP,但是我无法获得与此处所写相同的图像数据:(getImageData和Uint32Array)

var idata = ctx.getImageData(0, 0, w, h),      // get image data for canvas
buffer = idata.data,                       // get buffer (unnes. step)
buffer32 = new Uint32Array(buffer.buffer), // get a 32-bit representation
x, y,                                      // iterators
x1 = w, y1 = h, x2 = 0, y2 = 0;

有没有一种方法可以用PHP获取相同的数据?给出的Javascript方法有浏览器兼容性问题,我通过编写节点应用程序解决了这个问题。如果可能的话,我更愿意使用PHP方法。

1 个答案:

答案 0 :(得分:0)

$img = imagecreatefrompng($img_file);

    if (!ctype_xdigit($hex)) $hex = imagecolorat($img, 0,0);
    $b_top = $b_lft = 0;
    $b_rt = $w1 = $w2 = imagesx($img);
    $b_btm = $h1 = $h2 = imagesy($img);

    do {
        //top
        for(; $b_top < $h1; ++$b_top) {
            for($x = 0; $x < $w1; ++$x) {
                if(imagecolorat($img, $x, $b_top) != $hex) {
                    break 2;
                }
            }
        }

        // stop if all pixels are trimmed
        if ($b_top == $b_btm) {
            $b_top = 0;
            $code = 2;
            break 1;
        }

        // bottom
        for(; $b_btm >= 0; --$b_btm) {
            for($x = 0; $x < $w1; ++$x) {
                if(imagecolorat($img, $x, $b_btm-1) != $hex) {
                    break 2;
                }
            }
        }

        // left
        for(; $b_lft < $w1; ++$b_lft) {
            for($y = $b_top; $y <= $b_btm; ++$y) {
                if(imagecolorat($img, $b_lft, $y) != $hex) {
                    break 2;
                }
            }
        }

        // right
        for(; $b_rt >= 0; --$b_rt) {
            for($y = $b_top; $y <= $b_btm; ++$y) {
                if(imagecolorat($img, $b_rt-1, $y) != $hex) {
                    break 2;
                }
            }

        }

        $w2 = $b_rt - $b_lft;
        $h2 = $b_btm - $b_top;
        $code = ($w2 < $w1 || $h2 < $h1) ? 1 : 0;
    } while (0);