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 비트가 아닌 값. 당신이 원하는
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 비트가 아닌 값. 당신이 원하는
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);
}
}
'Marshal.Copy'를 사용하여 바이트를 가져 오는 것이 안전하지 않을 수 있습니다. – Nyerguds
그래,하지만 한 픽셀을 쿼리하기 위해 전체 버퍼를 복사해야하는 것은 짜증나. 그러나 일반적으로 대부분의 픽셀이 읽히지는 않지만 대부분이 경우 마샬입니다. 복사는 좋은 방법입니다. – vidstige
예 ...이 코드를 그대로 사용하면 일반적인 'GetPixel'과 같이 자주 언급되는 문제가 발생합니다. 모든 내용을 반복하면서 각 픽셀을 잠그고 잠금 해제해야 할 때 수천 또는 수천 개의 픽셀을 가질 수있는 이미지에서 악명 높게 느린 반면 바이트 배열의 내용을 검사하는 것은 번개처럼 빠릅니다. – Nyerguds
Bitmap
클래스의 메서드를 사용하면 팔레트 색인을 직접 가져올 수 없습니다.
Palette
속성을 사용하여 이미지의 팔레트를 가져 와서 색상을 찾을 수 있지만 해결 방법은 조금 있습니다.
팔레트 색인을 직접 가져 오려면 LockBits
메서드를 사용하여 이미지 데이터에 직접 액세스하십시오. 배열로 데이터를 복사하려면 마샬링을 사용하거나 안전하지 않은 모드로 포인터를 사용하여 액세스해야합니다.
Color
값의 A
속성은 알파 성분이다. 0에서 255까지의 값을 가질 수 있습니다. 0은 완전히 투명하고 255는 완전하게 고체입니다.
당신은 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;
}
팔레트에 중복이 있으면 신뢰할 수 없습니다. – Nyerguds
이미지 8 비트 인덱스 또는 비는 인덱스인가? –
@ErnodeWeerd 정직하게 인덱싱되지 않은 8bpp 형식을 발견하지 못했습니다. 의미있는 색상 정보를 저장하기에는 너무 작기 때문에 각 색상 구성 요소에 2 ~ 3 비트 만 있으면됩니다. – Nyerguds
@ Nyerguds - 발생하지 않아도 사양에 따라 가능하지 않음을 의미하지는 않습니다. 단색 또는 4 색 이미지는 전혀 멀리 가져 오지 않습니다. –