public unsafe static Bitmap ConvertPixelByPixel(IntPtr ipd) { ThumbnailGenerator.DIBSECTION dIBSECTION = default(ThumbnailGenerator.DIBSECTION); ThumbnailGenerator.GetObjectDIBSection(ipd, Marshal.SizeOf(dIBSECTION), ref dIBSECTION); int bmWidth = dIBSECTION.dsBm.bmWidth; int bmHeight = dIBSECTION.dsBm.bmHeight; Bitmap result; if (bmWidth <= 0 || bmHeight <= 0) { result = null; } else { FastBitmap fastBitmap = new FastBitmap(bmWidth, bmHeight); fastBitmap.LockBitmap(); ThumbnailGenerator.RGBQUAD *ptr = (ThumbnailGenerator.RGBQUAD *)((void *)dIBSECTION.dsBm.bmBits); for (int i = 0; i < dIBSECTION.dsBmih.biWidth; i++) { for (int j = 0; j < dIBSECTION.dsBmih.biHeight; j++) { int num = j * dIBSECTION.dsBmih.biWidth + i; if (ptr[num].rgbReserved != 0) { fastBitmap.SetPixel(i, j, ptr[num].rgbReserved, ptr[num].rgbRed, ptr[num].rgbGreen, ptr[num].rgbBlue); } } } fastBitmap.UnlockBitmap(); result = fastBitmap; } return(result); }
public static extern int GetObjectDIBSection(IntPtr hObject, int nCount, ref ThumbnailGenerator.DIBSECTION lpObject);