A
A
Aptixx2013-12-25 14:12:43
PHP
Aptixx, 2013-12-25 14:12:43

How to get file paths in folders and subfolders?

Hello! There is a folder and many subfolders that contain JPG images.
And there is a script to neutralize the watermark.

// Исходное изображение
$sourFile = 's.jpg';
// Маска-watermark
$maskFile = 'm.png';
// Конечное изображение
$saveFile = 'd.jpg';

// Открываем исходное изображение
$sour = imageCreateFromJpeg($sourFile);
// Открываем маску
$mask = imageCreateFromPng($maskFile);

// Получаем высоту и ширину изображения
$imgSize = getImageSize($sourFile);
$imgWidth = $imgSize[0];
$imgHeight = $imgSize[1];

// Создаем изображение, куда будет копировать конечно изображение
$dest = imageCreateTrueColor($imgWidth, $imgHeight);

// Бегаем по высоте 
for ($y = 0; $y < $imgHeight; $y++) { 
    // Бегаем по ширине
    for ($x = 0; $x < $imgWidth; $x++) {
        // Получаем цвета пикселя с вотермарка
        $SourRgb = getPixColor($sour, $x, $y);
        // Получаем цвета пикселя с маски
        $MaskRgb = getPixColor($mask, $x, $y);
        // Обращаем цвет RBG в обратную строну
        $red   = unBlend($SourRgb['r'], $MaskRgb['r'], $MaskRgb['a']);
        $green = unBlend($SourRgb['g'], $MaskRgb['g'], $MaskRgb['a']);
        $blue  = unBlend($SourRgb['b'], $MaskRgb['b'], $MaskRgb['a']);
        // Соединяем цвета в формат RGB
        $pixelcolor = ( $red << 16 ) | ( $green << 8 ) | $blue ;
        imagesetpixel($dest, $x, $y, $pixelcolor);
    }
}

// Сохраняем чистое изображение
imagejpeg($dest, $saveFile);
imagedestroy($dest);


/**
 * Обращает цвет вотермарка в исходный цвет
 * @param integer $pDest Цвет вотермарка
 * @param integer $pMask Цвет маски
 * @param float $pAlpha уровень прозрачности. От 0(полностью прозрачно) до 1(полностью непрозрачно)
 * @return integer 
 */
function unBlend( $pDest, $pMask, $pAlpha ){
    $color = $pMask;
    // Если $pMask == 1, то обратить не получится
    if ( $pAlpha != 1 ){
        // Обратная формула от формулы наложения вотермарка ( dest = ( sour + ( mask - sour ) * alpha )
        $color = ( $pDest - $pAlpha * $pMask ) / ( 1 - $pAlpha );
        // Не выходим ли мы запределы 0..255
        $color = $color < 0 ? 0 : round($color);
        $color = $color > 255 ? 255 : $color;
    }
    return $color;
}

/**
 * Получаем цвет пикселя с прозрачностью. 
 * Возвращает в формате array('r'=>int, 'g'=>int, 'b'=>int, 'a'=>float);
 * @param gdImage $pImage Handle на изображение
 * @param integer $pX позиция по X
 * @param integer $pY позиция по Y
 * @return array 
 */
function getPixColor($pImage, $pX, $pY){
    // Получаем цвет изображения
    $rgb = imagecolorat($pImage, $pX, $pY);
    // Преобразуем
    $red = ($rgb >> 16) & 0xFF;
    $green = ($rgb >> 8) & 0xFF;
    $blue = $rgb & 0xFF;
    // Преобразуем alpha, так как в PNG 127 это полная прозрачность, а 0 - не прозрачность
    $alpha = abs(( ($rgb >> 24) & 0xFF ) / 127 - 1);
    return array('r'=>$red, 'g'=>$green, 'b' => $blue, 'a' => $alpha );
}

Please tell me how to get the paths to the images in these subfolders in order to process them in bulk using this script.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
R
Rsa97, 2013-12-25
@Aptixx

Change the script to accept a filename from the command line and execute

# find /jpegs/root/dir -name '*.jpg' -exec /path/to/script {} \;

M
mrarthur, 2013-12-25
@faenir

glob. Here is an example of a recursive function: in.php.net/manual/en/function.glob.php#106595

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question