2013-05-12 8 views
1

C#에서 WinForm 응용 프로그램을 만들어서 파일의 24 비트 비트 맵을 "스니핑 (sniff out)"하는 데 사용할 수 있습니다. 필자는 오프셋, 파일에 기록되는 방법에 대한 분석 및 파일 길이와 같은 정보를 이미 수집했습니다. 파일에 대한바이트에서 BMP 만들기

그래서 자세한 내용은 다음과 같습니다

  • BMP 데이터가 역으로 기록됩니다. (실시 예 (255 0 0) (0 0 255)
  • 그것은 더 BMP 헤더가 없음을 기입 BMP의 화상 데이터 만 청크
  • PixelFormat 24 비트
  • 그 BMP 순수한 마젠타 (255.... RGB 0 255)

나는 다음과 같은 코드를 사용하고 있습니다.

  using (FileStream fs = new FileStream(@"E:\MyFile.exe", FileMode.Open)) 
      { 
        int width = 190; 
        int height = 219; 
        int StartOffset = 333333; // Just a sample offset 

        Bitmap tmp_bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

        Rectangle rect = new Rectangle(0, 0, tmp_bitmap.Width, tmp_bitmap.Height); 
        System.Drawing.Imaging.BitmapData bmpData = 
         tmp_bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, 
         tmp_bitmap.PixelFormat); 

        unsafe 
        { 
         // Get address of first pixel on bitmap. 
         byte* ptr = (byte*)bmpData.Scan0; 

         int bytes = width * height * 3; //124830 [Total Length from 190x219 24 Bit Bitmap] 

         int b; // Individual Byte 

         for (int i = 0; i < bytes; i++) 
         { 
          fs.Position = StartOffset - i; // Change the fs' Position [Subtract since I'm reading in reverse] 
          b = fs.ReadByte();    // Reads one byte from its position 

          *ptr = Convert.ToByte(b); // Record byte 
          ptr ++; 
         } 
         // Unlock the bits. 
         tmp_bitmap.UnlockBits(bmpData); 
        } 
        pictureBox1.Image = tmp_bitmap; 
       } 

나는이 출력을 얻을를 나는 이유는 다음 줄을 칠 때마다 바이트가 엉망지고 있다고 생각합니다. (255 0 255는 0 255 255가되고 그것이 될 때까지 계속됩니다 ES 255 255 0)

Output

난 당신이 나에게이 문제를 해결하는 데 도움 수 있기를 바랍니다. 대단히 감사드립니다.

솔루션 는 지금은

if (width % 4 != 0) 
    if ((i + 1) % (width * 3) == 0 && (i + 1) * 3 % width < width - 1) 
     ptr += 2; 

가 대단히 감사합니다 (제임스 Holderness에 의해 주어진 나의 친구 및 정보로부터 약간의 도움으로)이 코드를 추가하여 고정!

+0

문제는 비트 맵 데이터 픽셀이 서로 이어지는 경우 코드에서 bmpData.Stride를 사용하지 않는다고 생각되지만 라인을 변경할 때 픽셀에 속하지 않는 다른 데이터가있을 수 있습니다. 그래서 모든 것이 잘못되어,이 문제에 대한 답변을 게시 할 것입니다. – Mehran

답변

4

표준 BMP의 경우 각 개별 스캔 라인은 4 바이트의 배수가되어야하므로 24 비트 이미지 (픽셀 당 3 바이트)가있을 때마다 매 스캔마다 패딩을 허용해야하는 경우가 있습니다 라인은 예를 들어 4

의 배수에 그것을 가져, 경우 폭 150 개 픽셀 경우, 즉 그것을 4의 배수를 만들기 위해 452로 반올림 할 필요가 450 바이트의

I 그게 너가 여기서 겪고있는 문제일지도 모르지.

+0

이제는 잘 작동하고 있습니다. 귀하의 정보에 대해 대단히 감사합니다! – CudoX

+0

우수. 다행히 도울 수있어. –