Иногда растровые изображения перевернуты при получении эскизов файлов.

Я использую этот метод для получения миниатюр файлов (сохраняя прозрачность...):

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;
}

Но иногда изображение перевернуто. При получении одного и того же изображения во 2-й, 3-й раз оно не перевернуто. Есть ли способ определить, перевернуто это или нет? Если было какое-либо решение, приведенный ниже код должен работать:

if (isUpsideDown)
{
    int offset = (dibsection.dsBmih.biHeight - y - 1) * dibsection.dsBmih.biWidth + x;
}
else
{
    int offset = y * dibsection.dsBmih.biWidth + x;
}

person Mart    schedule 25.07.2013    source источник


Ответы (1)


Я столкнулся с той же проблемой. Изображения из буфера обмена перевернуты. Мне удалось выяснить, что вы можете проверить значение шага, чтобы увидеть, перевернуто ли изображение:

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

if (d.Stride > 0)
{
    bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
}

Если значение шага больше нуля, изображение переворачивается.

Энди

person DA.    schedule 16.12.2018