有时在获取文件缩略图时位图是颠倒的

Posted

技术标签:

【中文标题】有时在获取文件缩略图时位图是颠倒的【英文标题】:Sometimes bitmaps are upside down when getting file thumbnails 【发布时间】:2013-07-25 01:18:00 【问题描述】:

我使用这种方法来获取文件的缩略图(保持透明度...):

public static Image GetIcon(string fileName, int size)

    IShellItem shellItem;
    Shell32.SHCreateItemFromParsingName(fileName, IntPtr.Zero, Shell32.IShellItem_GUID, out shellItem);

    IntPtr hbitmap;
    ((IShellItemImageFactory)shellItem).GetImage(new SIZE(size, size), 0x0, out hbitmap);

    // get the info about the HBITMAP inside the IPictureDisp
    DIBSECTION dibsection = new DIBSECTION();
    Gdi32.GetObjectDIBSection(hbitmap, Marshal.SizeOf(dibsection), ref dibsection);
    int width = dibsection.dsBm.bmWidth;
    int height = dibsection.dsBm.bmHeight;

    // create the destination Bitmap object
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);

    unsafe
    
        // get a pointer to the raw bits
        RGBQUAD* pBits = (RGBQUAD*)(void*)dibsection.dsBm.bmBits;
        // copy each pixel manually
        for (int x = 0; x < dibsection.dsBmih.biWidth; x++)
        
            for (int y = 0; y < dibsection.dsBmih.biHeight; y++)
            
                int offset = y * dibsection.dsBmih.biWidth + x;
                if (pBits[offset].rgbReserved != 0)
                
                    bitmap.SetPixel(x, y, Color.FromArgb(pBits[offset].rgbReserved, pBits[offset].rgbRed, pBits[offset].rgbGreen, pBits[offset].rgbBlue));
                
            
        
    
    Gdi32.DeleteObject(hbitmap);

    return bitmap;

但有时图像是颠倒的。当第二次、第三次获得相同的图像时,它不会倒置。有什么方法可以确定它是否颠倒?如果有任何解决方案,下面的代码应该可以工作:

if (isUpsideDown)

    int offset = (dibsection.dsBmih.biHeight - y - 1) * dibsection.dsBmih.biWidth + x;

else

    int offset = y * dibsection.dsBmih.biWidth + x;

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。剪贴板中的图像倒置。我设法发现,您可以检查 Stride 值以查看图像是否反转:

BitmapData d = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
bmp.UnlockBits(d);

if (d.Stride > 0)

    bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);

如果 Stride 值大于零,则图像反转。

安迪

【讨论】:

以上是关于有时在获取文件缩略图时位图是颠倒的的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java检索mp3文件的缩略图

单击缩略图时如何显示全尺寸图像?

为啥我的 PHP 脚本在生成缩略图时会停止?

UWP 文件缩略图保存在 SQL Server 数据库中

每当未成功创建缩略图时,强制 ffmpeg 以错误代码退出

PHP获取远程图片并调整图像大小(转)