Используя значок Windows Vista 256 x 256 в приложении

Используйте read_csv с разделителем, отсутствующим в данных, таких как |, а затем str.rsplit с параметром n=3 для разделения на 3 пробела с правой стороны и expand=True для DataFrame:

import pandas as pd

temp=u"""Alabama 400 300 200
New York 400 200 100
Missouri 400 200 50
District of Columbia 450 100 250"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep="|", names=['Data'])

print (df)
                               Data
0               Alabama 400 300 200
1              New York 400 200 100
2               Missouri 400 200 50
3  District of Columbia 450 100 250


df = df['Data'].str.rsplit(n=3, expand=True)
print (df)

                      0    1    2    3
0               Alabama  400  300  200
1              New York  400  200  100
2              Missouri  400  200   50
3  District of Columbia  450  100  250

10
задан Peter Mortensen 8 October 2017 в 10:44
поделиться

4 ответа

Сегодня я сделал очень хорошую функцию для извлечения битовых карт 256x256 из иконок Vista.

Как и ты, Натан В, я использую ее для отображения большой иконки в виде битовой карты в окне "О программе". Например, этот код получает иконку Vista в виде PNG-изображения и выводит его на экран 256x256 PictureBox:

picboxAppLogo.Image = ExtractVistaIcon(myIcon);

Эта функция принимает в качестве параметра объект Icon. Таким образом, ее можно использовать с любыми иконками - из ресурсов, из файлов, из потоков и так далее. (Читайте ниже об извлечении иконки EXE)

Она работает на любой операционной системе , так как она не использует Win32 API, это 100% управляемый код :-)

// Based on: http://www.codeproject.com/KB/cs/IconExtractor.aspx
// And a hint from: http://www.codeproject.com/KB/cs/IconLib.aspx

Bitmap ExtractVistaIcon(Icon icoIcon)
{
    Bitmap bmpPngExtracted = null;
    try
    {
        byte[] srcBuf = null;
        using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            { icoIcon.Save(stream); srcBuf = stream.ToArray(); }
        const int SizeICONDIR = 6;
        const int SizeICONDIRENTRY = 16;
        int iCount = BitConverter.ToInt16(srcBuf, 4);
        for (int iIndex=0; iIndex<iCount; iIndex++)
        {
            int iWidth  = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex];
            int iHeight = srcBuf[SizeICONDIR + SizeICONDIRENTRY * iIndex + 1];
            int iBitCount   = BitConverter.ToInt16(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 6);
            if (iWidth == 0 && iHeight == 0 && iBitCount == 32)
            {
                int iImageSize   = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 8);
                int iImageOffset = BitConverter.ToInt32(srcBuf, SizeICONDIR + SizeICONDIRENTRY * iIndex + 12);
                System.IO.MemoryStream destStream = new System.IO.MemoryStream();
                System.IO.BinaryWriter writer = new System.IO.BinaryWriter(destStream);
                writer.Write(srcBuf, iImageOffset, iImageSize);
                destStream.Seek(0, System.IO.SeekOrigin.Begin);
                bmpPngExtracted = new Bitmap(destStream); // This is PNG! :)
                break;
            }
        }
    }
    catch { return null; }
    return bmpPngExtracted;
}

ВАЖНО! Если вы хотите загрузить эту иконку непосредственно из EXE-файла, то вы CAN'T используете [11827] иконку. ExtractAssociatedIcon(Application.ExecutablePath) в качестве параметра, так как .NET функция ExtractAssociatedIcon() настолько глупа, что извлекает ТОЛЬКО иконку 32x32!

Вместо этого лучше использовать весь класс IconExtractor, созданный Цудой Кагею (http://www.codeproject.com/KB/cs/IconExtractor.aspx). Вы можете немного упростить этот класс, чтобы сделать его меньше. Используйте IconExtractor таким образом:

// Getting FILL icon set from EXE, and extracting 256x256 version for logo...
using (TKageyu.Utils.IconExtractor IconEx = new TKageyu.Utils.IconExtractor(Application.ExecutablePath))
{
    Icon icoAppIcon = IconEx.GetIcon(0); // Because standard System.Drawing.Icon.ExtractAssociatedIcon() returns ONLY 32x32.
    picboxAppLogo.Image = ExtractVistaIcon(icoAppIcon);
}

Примечание: Я все еще использую здесь свою функцию ExtractVistaIcon(), потому что мне не нравится, как IconExtractor обрабатывает эту работу - сначала он извлекает все форматы иконок с помощью IconExtractor.SplitIcon(icoAppIcon), а затем вы должны знать точный индекс иконок 256x256, чтобы получить желаемый вид икон. Итак, использование моей функции ExtractVistaIcon() здесь намного быстрее и проще :)

.
9
ответ дан 3 December 2019 в 22:02
поделиться

Ни один из вышеупомянутых ответов не обрабатывает Значки Vista - только маленький (32x32) и большой (48x48)

Существует библиотека, которая обрабатывает Значки Vista здесь

... это выглядит довольно сложным из-за двойного-png формата альфа-канала.

Я попытаюсь сделать краткий ответ в vb .NET, но он может занять время.

2
ответ дан 3 December 2019 в 22:02
поделиться

Найденная информация здесь. Для получения большого значка Vista необходимо использовать метод Shell32 SHGetFileInfo. Я скопировал соответствующий текст ниже, конечно, Вы захотите заменить переменную имени файла "блоком. GetExecutingAssembly ().Location".

using System.Runtime.InteropServices;

Набор констант, которые мы будем использовать в вызове для SHGetFileInfo () для определения размера значка, который мы хотим получить:

// Constants that we need in the function call
private const int SHGFI_ICON = 0x100;
private const int SHGFI_SMALLICON = 0x1;
private const int SHGFI_LARGEICON = 0x0;

Структура SHFILEINFO очень важна, поскольку это будет наш дескриптор к различной информации о файле, среди которой графический значок.

// This structure will contain information about the file
public struct SHFILEINFO
{
    // Handle to the icon representing the file
    public IntPtr hIcon;
    // Index of the icon within the image list
    public int iIcon;
    // Various attributes of the file
    public uint dwAttributes;
    // Path to the file
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public string szDisplayName;
    // File type
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
};

Заключительная подготовка к неуправляемому коду должна определить подпись SHGetFileInfo, который расположен в популярном Shell32.dll:

// The signature of SHGetFileInfo (located in Shell32.dll)
[DllImport("Shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

Теперь, когда у нас есть все подготовленное, пора выполнить вызов к функции и отобразить значок, который мы получили. Объектом, который будет получен, является Тип значков (Система. Рисование. Значок), но мы хотим отобразить его в PictureBox, таким образом, мы преобразуем Значок в Битовый массив с помощью ToBitmap () метод.

Но в первую очередь существует 3 средств управления, которые необходимо добавить к форме, Кнопка btnExtract, который имеет "Значок Извлечения" для его текстового свойства, picIconSmall, который является PictureBox и picIconLarge, который является также PictureBox. Поэтому мы получим два размера значков. Теперь дважды щелкните по btnExtract в Режиме конструктора Visual Studio, и Вы доберетесь до его события Click. В нем остальная часть кода:

private void btnExtract_Click(object sender, EventArgs e)
{
    // Will store a handle to the small icon
    IntPtr hImgSmall;
    // Will store a handle to the large icon
    IntPtr hImgLarge;

    SHFILEINFO shinfo = new SHFILEINFO();

    // Open the file that we wish to extract the icon from
    if(openFile.ShowDialog() == DialogResult.OK)
    {
        // Store the file name
        string FileName = openFile.FileName;
        // Sore the icon in this myIcon object
        System.Drawing.Icon myIcon;

        // Get a handle to the small icon
        hImgSmall = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_SMALLICON);
        // Get the small icon from the handle
        myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
        // Display the small icon
        picIconSmall.Image = myIcon.ToBitmap();

        // Get a handle to the large icon
        hImgLarge = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON);
        // Get the large icon from the handle
        myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
        // Display the large icon
        picIconLarge.Image = myIcon.ToBitmap();

    }
}

ОБНОВЛЕНИЕ: найденный еще большим количеством информации здесь.

3
ответ дан 3 December 2019 в 22:02
поделиться

Взгляните на функции значка Windows, которые доступны. Существует также обзор, который упоминает, что запросил для различных размеров значков. Существует Мечта. В. Форум кода распараллеливает для использования API в C#, а также ссылке Pinvoke.net.

0
ответ дан 3 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: