Hi,
I am trying to display a SGI format image (.rgb) into a picturebox using SetDIBitsToDevice API.
The image file does not have header information.
But calling this function raises a argument exception, that parameter is incorrect. But I am not able to identify the incorrect parameter.
Calling this APICode://API declaration [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern int SetDIBitsToDevice(IntPtr hDC, int DestX, int DestY, uint wDestWidth, uint wDestHeight, int SrcX, int SrcY, uint uStartScan, uint uScanLines, byte[] lpBits, ref BITMAPINFO BitsInfo, uint uColorUse); [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr hDC); //Structures public struct PALETTEENTRY { public byte peRed; public byte peGreen; public byte peBlue; //public byte peFlags; } public struct BITMAPINFOHEADER { public uint biSize; public int biWidth; public int biHeight; public ushort biPlanes; public ushort biBitCount; public uint biCompression; public uint biSizeImage; public int biXPelsPerMeter; public int biYPelsPerMeter; public uint biClrUsed; public uint biClrImportant; } public struct BITMAPINFO { public BITMAPINFO(BITMAPINFOHEADER bmiHeader) { this.bmiHeader = bmiHeader; bmiColors = new PALETTEENTRY[256]; } public BITMAPINFOHEADER bmiHeader; public PALETTEENTRY[] bmiColors; } public const int BI_RGB = 0; public const int DIB_RGB_COLORS = 0;
I know I have hardcoded few things like width, height etc., but for this example, it has been fixed.Code:byte[] data = System.IO.File.ReadAllBytes("test.rgb"); //arranging bits to display RGB file correctly byte[] data3 = (new ReadImage(ref data)).ReadChannels(); PrintImage.BITMAPINFOHEADER bmiHeader = new PrintImage.BITMAPINFOHEADER(); bmiHeader.biSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(bmiHeader); bmiHeader.biWidth = 400; bmiHeader.biHeight = -400; //bmiHeader.biPlanes = 1; bmiHeader.biBitCount = 24; //bmiHeader.biClrUsed = 0; //bmiHeader.biClrImportant = 0; bmiHeader.biCompression = PrintImage.BI_RGB; bmiHeader.biSizeImage = 400 * 400; PrintImage.BITMAPINFO bmi = new PrintImage.BITMAPINFO(bmiHeader); IntPtr lhDC = PrintImage.CreateCompatibleDC(PrintImage.GetWindowDC(pictureBox1.Handle)); int test = PrintImage.SetDIBitsToDevice(lhDC, 0, 0, 400, 400, 0, 0, 0, 400, data3, ref bmi, PrintImage.DIB_RGB_COLORS);
Where could be the problem? I tried same API in VC++ (VS 2008), and it si displaying the image correctly.
What other options are available? I am ready/willing to learn this stuff.
Thank you



LinkBack URL
About LinkBacks


