2011-12-19 5 views
3

8 비트 비트 맵 컬러 이미지가 있습니다. 나는C# 프린트 픽셀 값

Color pixelcolor = b.GetPixel(j,i);  
Console.Write(pixelcolor.ToString() + " "); 

을 할 때 나는 단지 8 비트 값을 얻을 필요가

Color [A=255, R=255, G=255, B=255] 

를 얻을. R, G, B, A에 대해 24 비트가 아닌 값. 당신이 원하는

+0

이미지 8 비트 인덱스 또는 비는 인덱스인가? –

+0

@ErnodeWeerd 정직하게 인덱싱되지 않은 8bpp 형식을 발견하지 못했습니다. 의미있는 색상 정보를 저장하기에는 너무 작기 때문에 각 색상 구성 요소에 2 ~ 3 비트 만 있으면됩니다. – Nyerguds

+0

@ Nyerguds - 발생하지 않아도 사양에 따라 가능하지 않음을 의미하지는 않습니다. 단색 또는 4 색 이미지는 전혀 멀리 가져 오지 않습니다. –

답변

4

Bitmap 클래스를 직접 사용하는 방법은 없습니다. 그러나, 당신은 직접이 같은 unsafe 코드를 사용하여 픽셀에 액세스 할 수 LockBits 방법을 사용할 수 있습니다 :

: Remeber를 enable unsafe code에 프로젝트에서 첫번째.

private static unsafe byte GetIndexedPixel(Bitmap b, int x, int y) 
{ 
    if (x < 0 || x >= b.Width) throw new ArgumentOutOfRangeException("x", string.Format("x should be in 0-{0}", b.Width)); 
    if (y < 0 || y >= b.Height) throw new ArgumentOutOfRangeException("y", string.Format("y should be in 0-{0}", b.Height)); 
    var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Indexed); 
    try 
    { 
     var scan0 = (byte*) data.Scan0; 
     return scan0[x + y*data.Stride]; 
    } 
    finally 
    { 
     if (data != null) b.UnlockBits(data); 
    } 
} 
+0

'Marshal.Copy'를 사용하여 바이트를 가져 오는 것이 안전하지 않을 수 있습니다. – Nyerguds

+1

그래,하지만 한 픽셀을 쿼리하기 위해 전체 버퍼를 복사해야하는 것은 짜증나. 그러나 일반적으로 대부분의 픽셀이 읽히지는 않지만 대부분이 경우 마샬입니다. 복사는 좋은 방법입니다. – vidstige

+1

예 ...이 코드를 그대로 사용하면 일반적인 'GetPixel'과 같이 자주 언급되는 문제가 발생합니다. 모든 내용을 반복하면서 각 픽셀을 잠그고 잠금 해제해야 할 때 수천 또는 수천 개의 픽셀을 가질 수있는 이미지에서 악명 높게 느린 반면 바이트 배열의 내용을 검사하는 것은 번개처럼 빠릅니다. – Nyerguds

-1

값은 실제로 Red, Green 및 색상의 Blue 대응하는 구성 요소의 8 비트 비트 맵 값입니다 R, GB이다.

AAlfa입니다. 색의 투명도 값입니다. 신경 쓰지 않는다면 문자열 출력에 표시하지 마십시오.

+0

@downvoter : 설명해 주시겠습니까? – Tigran

+1

이것은 인덱싱 된 비트 맵이 작동하는 방식이 아닙니다 ... – vidstige

1

Bitmap 클래스의 메서드를 사용하면 팔레트 색인을 직접 가져올 수 없습니다.

Palette 속성을 사용하여 이미지의 팔레트를 가져 와서 색상을 찾을 수 있지만 해결 방법은 조금 있습니다.

팔레트 색인을 직접 가져 오려면 LockBits 메서드를 사용하여 이미지 데이터에 직접 액세스하십시오. 배열로 데이터를 복사하려면 마샬링을 사용하거나 안전하지 않은 모드로 포인터를 사용하여 액세스해야합니다.


Color 값의 A 속성은 알파 성분이다. 0에서 255까지의 값을 가질 수 있습니다. 0은 완전히 투명하고 255는 완전하게 고체입니다.

0

당신은 LockBits를 사용하지 않을 경우,이 작업을 수행 할 수 있습니다

/// <summary> 
/// Gets the pixel value in bytes. Uses Bitmap GetPixel method. 
/// </summary> 
/// <param name="bmp">Bitmap</param> 
/// <param name="location">Pixel location</param> 
/// <returns>Pixel value</returns> 
public static byte Get8bppImagePixel(Bitmap bmp, Point location) 
{ 
    Color pixelRGB = bmp.GetPixel(location.X, location.Y); 
    int pixel8bpp = Array.IndexOf(bmp.Palette.Entries, pixelRGB); 
    return (byte)pixel8bpp; 
} 
+0

팔레트에 중복이 있으면 신뢰할 수 없습니다. – Nyerguds