2012-03-08 5 views
2

한 장의 사진을 찍고, 모든 픽셀을 오른쪽으로 한 픽셀 이동하고, 왼쪽으로 한 개씩 옮기고 싶다고 가정 해 봅니다. 이 코드를 시도 :Perl을 사용하여 이미지의 픽셀 수정하기

my $image_file = "a.jpg"; 
my $im = GD::Image->newFromJpeg($image_file); 
my ($width, $height) = $im->getBounds(); 
my $outim = new GD::Image($width, $height); 

foreach my $x (1..$width) 
{ 
    foreach my $y (1..$height) 
    { 
     my $index = $im->getPixel($x-1,$y-1); 
     my ($r,$g,$b) = $im->rgb($index); 
     my $color = $outim->colorAllocate($r,$g,$b); 
     $outim->setPixel($x,$y,$color); 
    } 
} 
%printing the picture... 

그 트릭을하지 않는다; x = 0 또는 y = 0 인 픽셀을 제외한 모든 픽셀을 한 색상으로 그립니다. 내가 어디로 잘못 가고 있니? 워드 프로세서에서

답변

4

봐 : 항상 트루 될 것 JPEG 이미지를 읽어 생성

이미지. 이미지를 팔레트 기반으로 만들려면 선택적 $ truecolor 인수에 0 값을 전달하십시오.

색인이 생성되지 않습니다. newFromJpeg 전화에 ,0을 추가해보세요.

의견에서 다음 문제는 할당 할 색상 수입니다. 기본적으로 색인 된 이미지는 8 비트이며 최대 256 개의 고유 색상 (2^8 = 256)을 의미합니다. "간단한"해결 방법은 물론 트루 컬러 이미지를 사용하는 것이지만 트루 컬러 출력을 허용 할 수 있는지 여부에 따라 다릅니다.

그렇지 않은 경우 다음 단계는 이미지 자체의 가시적 인 결함을 최소화하는 "최적의"256 색 세트를 제안하는 것입니다 (http://en.wikipedia.org/wiki/Color_quantization 참조). 그 자체로는 오늘날 우리가 거의 걱정할 필요가없는 전체적인 주제였습니다. 여전히 걱정할 필요가 있다면 Imagemagik 또는 이와 유사한 도구와 같은 특수 도구로 작업을 수행하는 것이 나을 것입니다. 물론 도전을 좋아하지 않는 한.

+0

답장을 보내 주셔서 감사합니다. x = 0 또는 y = 0 인 곳은 어디에도 없지만 나머지는 한 색상으로 표시됩니다. 첫 번째 사진은 화려한 색상입니다. – ronash

+0

원본 이미지를 "인쇄"하려 했습니까? 제대로 읽었습니까? –

+0

예, 똑같은 이미지를 인쇄합니다. – ronash

0

x와 y의 방향을 반대로하여보십시오. 1에서 최대지만 1에서 최대로 변경하지 마십시오. 색상은 슬라이딩하지 않고 반복해서 복사합니다.

2

다음은 Imager을 사용하는 솔루션입니다. 매우 좋은 모듈이고 더 익숙하기 때문에 이미지 변환을 잘 처리합니다.

관련 문제