3

폭이 3000px, 2000px, 1000px, 500px 인 작은 크기의 축소판을 여러 개 생성하려는 큰 이미지 라이브러리 (8000x6000px ~ 13mb)가 있습니다. , 250px 및 100pxPython의 단일 대형 이미지에서 여러 축소판을 만드는 가장 빠른 방법

원본 이미지는 플랫 파일에 저장되고 생성 된 미리보기 이미지는 플랫 파일에 저장됩니다.

내가 파이썬에서이 작업을 수행 할 수있는 최적의 방법에 대해 생각해 봤는데

, 이들은 즉시 마음에 와서 잠재적 인 문제입니다

  • 이 소스 이미지에서 각 썸네일을 생성하기 위해 감각을 만들거나 할 수있는 것인가 약간 큰 썸네일에서 작은 썸네일을 만듭니다. 예 : 8000px -> 3000px, 3000px -> 2000px, 1000px -> 500px 등 ... 더 빠르게 실행되지 않습니까?
  • 미리보기 이미지를 생성하기 전에 소스 이미지를 메모리에로드하는 것이 합리적입니까?
  • ImageMagick을 사용해야합니까? 명령 줄에서 또는 API를 통해?
  • GPU를 사용할 방법이 있습니까?
  • 이 경우 여러 개의 스레드가 의미가 있습니까?

썸네일 생성을 최적화 할 때 유의해야 할 다른 사항이 있습니까? 샘플 코드는 크게 환영합니다. 고맙습니다.

+0

* "이미지가 플랫 파일에 저장됩니다"* 무엇을 의미합니까? 'JPEG' 또는'TIFF' 또는 someesuch를 의미합니까? 울퉁불퉁 한 파일은 무엇이겠습니까? –

답변

0

몇 가지 이미지를 만들고 몇 가지 테스트를 수행하여 다양한 기법의 성능에 영향을 줄 수 있습니다.

-rw-r--r-- 1 mark staff 13M 23 Aug 17:55 image.jpg 

I :

나는 ls이 같은 13메가바이트을 제공, 이미지가 무작위 차원에서 데이터 - 압축 - 어렵고 즉, 당신에 맞게 다음

convert -size 8000x6000 xc:gray +noise random -quality 35 image.jpg 

filesizes 포함했다 내 컴퓨터의 8 개 CPU 코어로 나눌 수 있기 때문에 128 개의 임의의 이미지를 만들었습니다. 나중에 병렬 테스트를 참조하십시오. 방법에 대한 지금

... 1

이 순진한 방법이다

방법 - 당신은 당신이 하나씩, 요청 모든 파일을 만들 수 있습니다.

#!/bin/bash 
for f in image*jpg; do 
    for w in 3000 2000 1000 500 250 100; do 
     convert $f -resize ${w}x res_${f}_${w}.jpg 
    done 
done 

시간 : 26 분 46 초 우리 한번만 각 화상을 판독하지만, 하나의 입력 화상의 모든 출력의 크기를 생성하는 2 여기

방법과 상당히 빠르다 .

#!/bin/bash 
for f in image*jpg; do 
    convert $f -resize 3000x -write res_${f}_3000.jpg \ 
       -resize 2000x -write res_${f}_2000.jpg \ 
       -resize 1000x -write res_${f}_1000.jpg \ 
       -resize 500x -write res_${f}_500.jpg \ 
       -resize 250x -write res_${f}_250.jpg \ 
       -resize 100x res_${f}_100.jpg 
done 

시간 : 6 분 17 초

방법 다음 3

우리는 우리가 필요로하는가는 최대 화상 만 3000x2250 픽셀임을 선행 ImageMagick를 조언, 그래서 더 적은 메모리를 사용하고 적은 수의 DCT 레벨을 읽고 적은 I/O를 수행 할 수 있습니다. 이것을 "shrink-on-load"라고합니다.

#!/bin/bash 
for f in image*jpg; do 
    convert -define jpeg:size=3000x2250 $f   \ 
       -resize 3000x -write res_${f}_3000.jpg \ 
       -resize 2000x -write res_${f}_2000.jpg \ 
       -resize 1000x -write res_${f}_1000.jpg \ 
       -resize 500x -write res_${f}_500.jpg \ 
       -resize 250x -write res_${f}_250.jpg \ 
       -resize 100x res_${f}_100.jpg 
done 

시간 : 3 분 37의

그냥 옆으로, 당신은 ImageMagick를 말할 때, I/O 및 메모리가 필요한 감소 된 시간을 보여주기 위해 선행 당신이 필요로하는거야 얼마나 큰 4백15메가바이트 2 초

/usr/bin/time -l convert image.jpg -resize 500x result.jpg 2>&1 | egrep "resident|real"   
1.92 real   1.77 user   0.14 sys 
415727616 maximum resident set size 

: 이미지는 업 프런트, 모두 당신 8000x6000, 13메가바이트 이미지 중 하나를 읽고 모두 같은 썸네일을 생성,이 두 가지 명령을 비교

/usr/bin/time -l convert -define jpeg:size=500x500 image.jpg -resize 500x result.jpg 2>&1 | egrep "resident|real" 

0.24 real   0.23 user   0.01 sys 
23592960 maximum resident set size 

즉, 23MB 및 0.2 초 - 출력 이미지의 내용과 품질은 동일합니다.

방법 4 여기서 우리는 미친 당신의 CPU의 팬과 전력 소비를 보내는 모든 아웃 가서 모든 전술 한 기술뿐만 아니라 GNU가 병렬 사용

!

#!/bin/bash 
for f in image*jpg; do 
    cat<<EOF 
convert -define jpeg:size=3000x2250 $f   \ 
       -resize 3000x -write res_${f}_3000.jpg \ 
       -resize 2000x -write res_${f}_2000.jpg \ 
       -resize 1000x -write res_${f}_1000.jpg \ 
       -resize 500x -write res_${f}_500.jpg \ 
       -resize 250x -write res_${f}_250.jpg \ 
       -resize 100x res_${f}_100.jpg 
EOF 
done | parallel 

시간 : 56초 요약

우리 말해서 불필요 회피 화상을 판독하고 가능한 입력에 따라 많은 출력을 수행하여 56초 27 분의 처리 시간을 감소시킬 수있다 ImageMagick은 입력 이미지의 양을 읽고 GNU Parallel을 사용하여 멋진 CPU 코어를 모두 사용하도록합니다. HTH.

관련 문제