2013-07-11 2 views
3

캡쳐 한 X 디스플레이의 크기를 축소하여 새로운 윈도우에 표시하려고합니다. 개별 RGB 구성 요소의 평균을 시도했지만 이미지가 너무 좋지 않습니다. 다음은 알고리즘입니다.C에서 원시 24 비트 픽셀 맵 조정

img = XGetImage(d_remote,RootWindow(d_remote,0),0,0,attr.width,attr.height,XAllPlanes(),ZPixmap); 

    int i; 
    int j; 
    for(i=0;i<attr.height;i=i+2){ 
     for(j=0;j<attr.width;j=j+2) { 
       unsigned long p1 = XGetPixel(img, j, i); 
       unsigned long p1R = p1 & 0x00ff0000; 
       unsigned long p1G = p1 & 0x0000ff00; 
       unsigned long p1B = p1 & 0x000000ff; 

       unsigned long p2 = XGetPixel(img, j+1, i); 
       unsigned long p2R = p2 & 0x00ff0000; 
       unsigned long p2G = p2 & 0x0000ff00; 
       unsigned long p2B = p2 & 0x000000ff; 

       unsigned long p3 = XGetPixel(img, j, i+1); 
       unsigned long p3R = p3 & 0x00ff0000; 
       unsigned long p3G = p3 & 0x0000ff00; 
       unsigned long p3B = p3 & 0x000000ff; 

       unsigned long p4 = XGetPixel(img, j+1, i+1); 
       unsigned long p4R = p4 & 0x00ff0000; 
       unsigned long p4G = p4 & 0x0000ff00; 
       unsigned long p4B = p4 & 0x000000ff; 

       unsigned long averageR = (p1R+p2R+p3R+p4R)/4; 
       unsigned long averageG = (p1G+p2G+p3G+p4G)/4; 
       unsigned long averageB = (p1B+p2B+p3B+p4B)/4; 

       int average = averageR | averageG | averageB | 0x00000000; 

       XPutPixel(newImg, j/2, i/2, average); 

     } 
    } 

픽셀을 평균하는 것이 좋지 않은가요? 기본적으로 img를 50 %로 확장하려고합니다. 내 가정은 픽셀 맵을 가로 질러 2x2 정사각형을 이동한다는 것입니다. 그렇게함으로써

+1

니스 이름 (, 그것은 확인을해야 나는 또한 이중 operator precedence 체크)

: 절대적으로 아무것도하지 않는 존 doe' ! 따라서 사람들은 항상 이야기하고 있습니다 :-) –

+0

XWindow 시스템의 일부로이 작업을 수행하는 표준 방법이 있거나 그렇지 않으면 확장을 수행하기 위해 일부 오픈 소스 이미지 라이브러리를 사용해야합니다. –

+1

@antonio가 정확한 대답을 주었지만, 이러한 종류의 저렴한 다운 스케일링은보다 정교한 기술보다 덜 매력적이라는 것도 알아야합니다. –

답변

10

:

unsigned long averageR = (p1R+p2R+p3R+p4R)/4; 
unsigned long averageG = (p1G+p2G+p3G+p4G)/4; 
unsigned long averageB = (p1B+p2B+p3B+p4B)/4; 

int average = averageR | averageG | averageB | 0x00000000; 

당신은 당신의 색깔 "오염"됩니다 (p1R + p2R + P3R + P4R)의 합이 4의 배수가 아닌 경우에는 비트 G 필드를 입력을 (해야합니다 가장 중요한 비트에서!). (p1G + p2G + p3G + p4G) 및 B 필드와 동일합니다. 당신이해야 할 :

unsigned long averageR = (p1R+p2R+p3R+p4R)/4 & 0x00ff0000; 
unsigned long averageG = (p1G+p2G+p3G+p4G)/4 & 0x0000ff00; 
unsigned long averageB = (p1B+p2B+p3B+p4B)/4 & 0x000000ff; 

int average = averageR | averageG | averageB; 

을 마지막으로`을 0x00000000이 필요하지 않습니다, 그것은`

+1

당신이 옳습니다! –