2017-01-03 6 views
-1

Marshall.Copy로 바이트를 복사하려고합니다. 내 코드는 작동하지만 바이트는 이상하다. 제 생각에는, 실제 바이트가 아닌 인덱스가 있습니다. 이 계산하고 다시 저장하면 훨씬 더 큰 바이트 크기 (이미지 크기가 동일합니다) 이미지에서 다른 색상 있어요. 바이트에서Marshall.Copy를 사용하여 비트 맵에서 바이트 배열로 바이트를 복사하고 다시 작동하지 않습니다.

Bitmap bmp = new Bitmap(imagepath); 
    Width = bmp.Width; 
    Height = bmp.Height; 
    byte[] data; 
    BitmapData bdata; 
    switch (bmp.PixelFormat) 
    { 
     case PixelFormat.Format8bppIndexed: 
     { 
     data = new byte[Width * Height]; 
     bdata = bmp.LockBits(new Rectangle(0, 0, Width, Height),ImageLockMode.ReadOnly, bmp.PixelFormat); 
     Marshal.Copy(bdata.Scan0, data, 0, data.Length); 
     bmp.UnlockBits(bdata); 
     break; 
     } 
    } 

저장 이미지 :

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); 
IntPtr pNative = bmData.Scan0; 
Marshal.Copy(data, 0, pNative, Width * Height); 
bmp.UnlockBits(bmData); 
bmp.Save("output.gif",ImageFormat.Gif); //without format, have same problem 

처음 픽셀의 색상을 읽으면

, 내가 가지고 : Color [A=0, R=0, G=0, B=2]. 이것은 입력 이미지에서 실제로 색깔입니까?

나는 왜 출력이 입력과 다른지 알 수 없다. 문제가 어디에 있습니까? 입력과 (작은 이미지에 대한 죄송) 출력에서 ​​

예 : Input Output

+0

ImageConverter 클래스를 사용하여 비트 맵을 바이트 배열로 변환하면 항상 잘 작동합니다. – Sasha

답변

1

당신은 바이트를 다시로드에 대한 두 번째 bmp을 생성하는 방법을 보여주지 않았다. 그러나 PixelFormat8bbpIndexed입니다. 즉, data 어레이에는 직접 색상 정보 대신 팔레트 색인이 포함됩니다. 두 번째 bmp을 8 비트 픽셀 형식으로 만들면 기본 팔레트가 사용되며 원래 팔레트와 다를 수 있습니다.

첫 번째 이미지의 bmp.Palette을 저장 한 다음이를 사용하여 두 번째 bmp 인스턴스의 실제 색상을 복원해야합니다.

업데이트 : 팔레트 항목을 하나씩 설정할 수 있지만 아무 효과가 없습니다. 대신 전체 팔레트를 설정해야합니다. 또한 here은 인덱싱 된 비트 맵 조작 (ConvertPixelFormat 참조) 방법이있는 게시물입니다.

+0

팔레트에 대해 기억해야 할 주요 사항은 팔레트 객체의 getter가 내부 객체를 참조하는 대신 새 객체를 만드는 것입니다. 따라서 이미지의 팔레트의 저장되지 않은 사본 만 편집하기 때문에'bmp.Palette.Entries [0] = col'로 편집 할 수 없습니다. – Nyerguds