>

고해상도 600+ MP 이미지를 생성하는 프로세스가 있습니다. 이 이미지는 RAM (40MB 압축률)에로드 될 때 약 2GB입니다. 색인을 생성하고 PHP 웹 앱을 통해 사용할 수있게합니다.

픽셀 단위로 관심있는 영역을 알려주는 데이터가 있으므로 전체 내용을 메모리에로드하지 않고 이미지의 특정 영역을 읽을 수있는 방법이 있는지 궁금합니다. 파일 포인터를 통해 이동하지만 읽을 시간을 선택하는 것과 같습니다. 목표는 관심 영역의 작은 그림을 만드는 것입니다.

PHP에는 몇 가지 이미지 처리 라이브러리가 있고 Python에는 몇 가지 이상의 라이브러리가 있다는 것을 알고 있지만 라이브러리와 관련하여 올바른 질문이 무엇인지 모르겠습니다.

정말로 PHP 또는 Python에서 솔루션을 찾고 있습니다

  • 답변 # 1

    php-vips는 필요할 때 필요한 부분 만 읽습니다. 일반적으로 imagemagick보다 3 배에서 5 배 빠르며 훨씬 적은 메모리가 필요합니다.

    많은 이미지 형식은 무작위 액세스를 허용하지 않습니다. JPEG, PNG, GIF 및 기타 여러 기능을 사용하면 원하는 픽셀보다 먼저 적어도 픽셀을 압축 해제해야합니다. 처리하는 정렬 이미지의 경우 이미지 속도가 매우 느립니다.

    하나의 솔루션은 JPEG 압축 타일 TIFF로 전환하는 것입니다. 이 형식은 이미지를 기본적으로 256x256 픽셀 타일로 나누고 각각을 개별적으로 압축합니다. 타일은 색인이있는 TIFF 파일에 저장되므로 개별 타일을 매우 빨리 가져올 수 있습니다.

    예를 들어, 다음과 같이 libvips를 사용하여 거대한 JPEG 이미지를 JPEG 압축 타일 스티프로 변환 할 수 있습니다.

    $ time vips copy wac_nearside.jpg wac_nearside.tif[tile,compression=jpeg]
    real    0m3.891s
    user    0m6.332s
    sys     0m0.198s
    peak RES 40mb
    
    

    색인은 이미지를 조금 더 크게 만들지 만 너무 나쁘지는 않습니다 :

    $ ls -l wac_nearside.* 
    -rw-r--r-- 1 john john 74661771 May  7  2015 wac_nearside.jpg
    -rw-r--r-- 1 john john 76049323 Feb 24 15:39 wac_nearside.tif
    $ vipsheader wac_nearside.jpg wac_nearside.jpg: 24000x24000 uchar, 1 band, b-w, jpegload
    
    

    다음과 같이 PHP에서 랜덤 영역을 읽을 수 있습니다 :

    #!/usr/bin/env php
    <?php
    require __DIR__ . '/vendor/autoload.php';
    use Jcupitt\Vips;
    $image = Vips\Image::newFromFile($argv[1]);
    $region_width = 100;
    $region_height = 100;
    for ($i = 0; $i < 100; $i++) {
        $left = rand(0, $image->width - $region_width - 1);
        $top = rand(0, $image->height - $region_height - 1);
        $region = $image->crop($left, $top, $region_width, $region_height);
        $region->writeToFile($i . ".jpg");
    }
    
    

    이 프로그램을 다음과 같이 실행할 수 있습니다 :

    $ time ./crop.php ~/pics/wac_nearside.tif 
    real    0m0.207s
    user    0m0.181s
    sys     0m0.042s
    peak RES 36mb
    
    

    이 오래된 랩탑에서는 0.2 초가 넘는 100 개의 JPEG 파일을 읽고 생성하고 있습니다.

  • 답변 # 2

    Java에서 많이 사용했던 ImageMagick을 살펴보고 싶을 것입니다 매우 유사한 일을하는 데 성공했습니다.

    학습 곡선이 약간 있지만 매우 강력하며 https://www.imagemagick.org/script/command-line-processing의 "이미지 영역 선택"의 명령 줄 예제를 믿습니다. PHP는 당신이 묘사하는 것을 보여줍니다 (더 큰 이미지에서 작은 알려진 AoI 추출).

  • 이전 angular - kendo-chart-series의 kendo-chart-series-item-label에 템플릿을 추가하는 방법은 무엇입니까?
  • 다음 sql - 범위를 부울로 변환