PHP+imagick에서 Metashape에서 내보낸 마스크를 이미지에 중첩

7647 단어 PHPImagick
Agisoft의 촬영 측정 소프트웨어인 Metashape의 마스크 처리가 매우 무겁기 때문에 나는 마스크를 내보내서 원 이미지에 중첩한 후에 Metashape로 돌아가는 것을 고려한다.
메타샤프뿐만 아니라 일반 마스크(커팅) 처리에도 사용할 수 있다.

PHP, ImageMagik, imagick 설치


운영 체제는 Windows10Home(64bit)
설치라기보다는 파일을 다운로드하여 압축을 풀기만 하면 된다.
PHP
https://windows.php.net/download/
php-7.3.20-nts-Win32-VC15-x64.zip를 다운로드하여 적당한 곳으로 압축을 풀다.
웹 서버에서 사용하려면 VC,ts(Thread Safe)/nts(Non Thread Safe)는 서버와 일치해야 하며 x64가 아닌 x86을 사용해야 할 때도 있지만 이번에는 명령줄에서만 사용하기 때문에 적절하게 선택했습니다.
버전 (7.3.20) 은 다음 imagick에 대응하는 최신 버전을 선택했습니다.
ImageMagik
https://windows.php.net/downloads/pecl/deps/
ImageMagick-7.0.7-11-vc15-x64.zip를 다운로드하여 적당한 곳으로 압축을 풀다.
imagick
https://windows.php.net/downloads/pecl/snaps/imagick/3.4.3/
php_imagick-3.4.3-7.3-nts-vc15-x64.zip 다운로드
php_imagick.dll을 php 압축을 풀기 위한 폴더의 ext 폴더로 복사합니다.다른 파일을 무시합니다.
VC, ts/nts, 버전 후면(7.3)은 PHP와 일치합니다.
php.ini 설정
php.ini-development를 복사하여 파일 이름을 php합니다.ini로 변경합니다.
만든 php.편집기에서 ini 열기
;extension_dir = "ext"
에 대한 주석 출력 (첫 번째;)삭제
extension=php_imagick.dll
추가된 행.

마스크 처리 코드



원본 이미지 aa.JPG 배경의 방이 엉망진창이어서 눈을 가렸다(땀)

Metashape에서 내보내는 마스크 aa_mask.png
Metashape에서 원본 이미지의 파일 이름_mask.png의 이름으로 출력합니다.

그림 aa를 출력합니다.jpg
메타데이터로 돌아가는 것을 감안하면 파일 이름은 원본 이미지와 같습니다.
Metashape에서 출력된 마스크가 투명하게 설정되지 않아 α값으로 중첩할 수 없습니다.나도 imagick으로 투과처리를 하고 싶지만 투과처리를 하지 않아도 단순하게 COMPOSITE_ULTIPLY만 하면 잘 될 거야.
검은색 픽셀 RGB의 값은 모두 0이고 흰색 픽셀은 255(2진수라면 1은 8개)이지만 보통 곱하면 255를 초과하기 때문에 픽셀 값은 1/255 다음에 곱하는 건가요?그러면 검은색은 0, 흰색은 1이므로 마스크 처리가 가능합니다.$image->compositeImage($mask, Imagick::COMPOSITE_MULTIPLY , 0, 0);원본 이미지 측면에서 몽판 이미지를 곱하면 미소로 원본 이미지의 Exif 데이터(카메라의 렌즈 정보와 촬영 조건을 기록한 원본 데이터)를 그대로 보존할 수 있다.(Metashape로 돌아간 후 3D 모델을 제작할 때 이 정보는 상당히 중요해졌다.)
반대로 Exif 데이터를 삭제하려면 마스크 이미지와 원본 이미지를 반대로 할 수 있습니다.
코드 전문은 여기 있습니다.
mask.php
<?php
ini_set("memory_limit", "-1"); // 一時的にメモリ制限をなくす

$input_path  = 'C:/(元画像が入っているフォルダ)/*.JPG';         // 入力ファイル
$mask_path   = 'C:/(MetashapeからマスクをExportしたフォルダ)';  // マスクファイルのフォルダ
$output_path = 'C:/(マスク済み画像を出力するフォルダ)';         // 出力先フォルダ

// 入力ディレクトリ内の全JPGファイルに対してマスク処理
$i = 0;
foreach(glob($input_path) as $file){
    if(is_file($file)){
        $file_num = preg_replace("/^.+\/([^\/]+)\.JPG/", "$1", $file); // ファイルパスからファイル名取得
        $mask_file = $mask_path . '/' . $file_num. '_mask.png';        // マスクファイルのパス
        $out_file = $output_path . '/' . $file_num. '.jpg';            // 出力ファイルのパス

        mask_iamge($file, $mask_file, $out_file);
        $i = $i + 1;
    }
}

// 元画像にマスクをかけて新しい画像を保存する関数
function mask_iamge($inputfile, $maskfile, $outputfile) {
    $image   = new Imagick($inputfile);
    $mask    = new Imagick($maskfile);

    $image->compositeImage($mask, Imagick::COMPOSITE_MULTIPLY , 0, 0); 
    $image->writeImage($outputfile); 
}

?>

마스크 작업 수행


Windows 명령 프롬프트를 시작하여 다음 세 가지 명령을 실행합니다.
Windows의 환경 변수 PATH는 PC에 로그인하지 않으려고 명령 프롬프트에 일시적으로 설정되어 있습니다.c:\php는 php-7.3.20-nts-Win32-VC15-x64입니다.zip을 압축 해제하는 곳, C:\ImageMagick은 ImageMagick-7.07-11-vc15-x64입니다.압축을 푸는 곳입니다.
cd (mask.phpを保存したフォルダのパス)
set PATH=%PATH%;C:\php;C:\ImageMagick\bin
php mask.php
※ 처리가 끝나면 php.ini의 extension=php_imagick.dll에 주석을 달지 않으면 다른 도중에 PHP를 사용할 때 오류가 발생합니다.
오류를 방지하려면 운영 체제 설정의 환경 변수 PATH에 C:\ImageMagick\bin을 등록해야 합니다.

좋은 웹페이지 즐겨찾기