Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1550 / 1527 / 325
Регистрация: 03.10.2012
Сообщений: 1,558

Как получить миниатюру видеофайла?

25.07.2026, 18:20. Показов 2999. Ответов 46

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане. Кто исследовал эту тему, поделитесь пожалуйста опытом как получить миниатюру видеофайла (как в проводнике), или первый кадр видео
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2026, 18:20
Ответы с готовыми решениями:

Создание видеофайла из Bitmap-ов или разложение видеофайла на Bitmap-ы
1)Вопрос такой Есть Видео! как его программно разбить на bitmap-ы! 2)Вопрос как сделать видео...

Как получить первый кадр из видеофайла
Здравствуйте, уважаемые форумчане. Прошу помощи в решении такой задачи: Как получить первый кадр из...

Как получить бинарное представление видео-файла (Кодирование видеофайла)
Всем привет. У меня такой вопрос: если любая информация может быть представляна в двоичном виде, то...

46
 Аватар для XIST
1968 / 1077 / 149
Регистрация: 01.10.2009
Сообщений: 3,643
Записей в блоге: 1
30.07.2026, 08:49
Студворк — интернет-сервис помощи студентам
I can, т.е вы хотите сказать что нужно было на 1,1 версии остановиться и не эволюционировать? Т.е. linq, Async / Await, record, ASP.NET Core, Blazor, Span и еще сотни нововведений это свистоперделки?
0
jump
 Аватар для I can
5005 / 4772 / 852
Регистрация: 13.04.2015
Сообщений: 10,027
30.07.2026, 09:06
Цитата Сообщение от XIST Посмотреть сообщение
linq, Async / Await, record, ASP.NET Core, Blazor, Span и еще сотни нововведений это свистоперделки?
Нет, свистоперделки - это стало красиво, но тормозит и платно.
0
 Аватар для XIST
1968 / 1077 / 149
Регистрация: 01.10.2009
Сообщений: 3,643
Записей в блоге: 1
30.07.2026, 09:08
Цитата Сообщение от I can Посмотреть сообщение
Нет, свистоперделки - это стало красиво, но тормозит и платно.
например?
0
jump
 Аватар для I can
5005 / 4772 / 852
Регистрация: 13.04.2015
Сообщений: 10,027
30.07.2026, 09:20

Не по теме:

Цитата Сообщение от XIST Посмотреть сообщение
например?
Что б потом меня эти "платные" засудили? Нет уж, увольте.

0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
30.07.2026, 09:35
По-моему все отошли от темы вопроса.
Без обид, но можно обсудить "наболевшее" в другом разделе, существующем для подобных дискуссий.
2
30.07.2026, 09:39

Не по теме:

Цитата Сообщение от Yury Komar Посмотреть сообщение
Без обид, но можно обсудить "наболевшее" в другом разделе
Согласен, нужно разделе юмора такое обсуждать, а то некоторые товарищи слишком серьёзно это восприняли.

0
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
30.07.2026, 10:28
Yury Komar, Ваш код всегда возвращает Nothing , даже c исправлением MrCrown, может у меня просто не тот Framework?
0
77 / 73 / 6
Регистрация: 11.04.2021
Сообщений: 304
Записей в блоге: 7
30.07.2026, 13:34
Kulma,

Не по теме:

это понятно... но их регулярно хакеры имеют... дошло до абсурда. за последние 11 лет нем. железная дорога деградировала. поезда приходили с огромными опозданиями или вообще не приходили или вообще ехали не в ту сторону. Последняя хакерская атака длилась всего 3 с чем то часа и за это время поезда пришли или вовремя или с минимальным опозданием. Когда хакеры вырубили IT-инфраструктуру, система упала в аварийный, децентрализованный режим. Диспетчерам на местах пришлось связываться по рациям и управлять движением вручную, по старинке. В этом режиме у них не было сложных алгоритмов — они просто давали команду «поехали» на свободный перегон. Локальные диспетчеры не переживали о том, что где-то в Мюнхене поезд опоздает на 5 минут. Они тупо пропускали состав дальше.

0
1550 / 1527 / 325
Регистрация: 03.10.2012
Сообщений: 1,558
30.07.2026, 17:47  [ТС]
Тим70, фреймворк здесь ни причём. попробуй поменять местами 84 и 83 строчки . Сейчас сам не могу проверить.

Добавлено через 14 минут
Похоже, что на момент прохождения условия, переменная shellItemPtr ещё не получила значение.
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4372 / 3442 / 512
Регистрация: 27.01.2014
Сообщений: 6,266
31.07.2026, 04:10
Тим70, попробуйте следующее

1. Исправить объявление GetImage с Sub на Function

VB.NET
1
2
3
4
5
6
7
8
9
10
11
<ComImport>
<Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Private Interface IShellItemImageFactory
    <PreserveSig>
    Function GetImage(
        <MarshalAs(UnmanagedType.Struct)> ByVal size As NativeSize,
        ByVal flags As SIIGBF,
        <Out> ByRef phbm As IntPtr
    ) As Integer
End Interface
2. Заменить функцию GetFileThumbnail на этоу

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Function GetFileThumbnail(filePath As String, width As Integer, height As Integer) As Bitmap
    Dim shellItemPtr As IntPtr = IntPtr.Zero
    Dim hBitmap As IntPtr = IntPtr.Zero
    Dim iidShellItemImageFactory As Guid = GetType(IShellItemImageFactory).GUID
 
    Try
        Dim hr As Integer = SHCreateItemFromParsingName(filePath, IntPtr.Zero, iidShellItemImageFactory, shellItemPtr)
        If hr <> 0 OrElse shellItemPtr = IntPtr.Zero Then Return Nothing
 
        Dim imageFactory As IShellItemImageFactory = CType(Marshal.GetTypedObjectForIUnknown(shellItemPtr, GetType(IShellItemImageFactory)), IShellItemImageFactory)
        Dim nativeSizeObj As New NativeSize() With {.Width = width, .Height = height}
 
        'Получаем thumbnail
        hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.RESIZETOFIT, hBitmap)
        If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
            'Если нет thumbnail, то берем иконку файла
            hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.ICONONLY, hBitmap)
            If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
                Return Nothing
            End If
        End If
 
        Return GetBitmapWithAlpha(hBitmap)
 
    Finally
        If hBitmap <> IntPtr.Zero Then DeleteObject(hBitmap)
        If shellItemPtr <> IntPtr.Zero Then Marshal.Release(shellItemPtr)
    End Try
End Function
1
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
31.07.2026, 04:53
Yury Komar, Не помогло... Все возвращает Nothing.
Цитата Сообщение от MrCrown Посмотреть сообщение
попробуй поменять местами 84 и 83 строчки
не возможно,т.к в 83 строке hr принимает значение.
0
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
31.07.2026, 05:20
Yury Komar, Похоже из за 84 строки всегда Nothing,но непонятно почему.
hr принимает отрицательное значение,а shellItemPtr = IntPtr.Zero
Миниатюры
Как получить миниатюру видеофайла?  
0
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
31.07.2026, 05:43
Похоже из за того ,что на момент срабатывания 84 строки shellItemPtr не принимает никаго значения.
0
jump
 Аватар для I can
5005 / 4772 / 852
Регистрация: 13.04.2015
Сообщений: 10,027
31.07.2026, 07:22
Лучший ответ Сообщение было отмечено MrCrown как решение

Решение

Тим70, попробуй декларацию SHCreateItemFromParsingName исправить так


VB.NET
1
2
3
4
5
6
7
8
    <DllImport("shell32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Unicode)>
    Private Function SHCreateItemFromParsingName(
        <MarshalAs(UnmanagedType.LPWStr)> pszPath As String,
        pbc As IntPtr,
        ByRef riid As Guid,
        <Out> ByRef ppv As IntPtr
    ) As Integer ' HRESULT
    End Function
3
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
31.07.2026, 09:30
I can, Спасибо,все заработало.Теперь код выглядит так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
 
Public Module ShellThumbnailHelper
 
    'Структура размеров для Win API
    <StructLayout(LayoutKind.Sequential)>
    Private Structure NativeSize
        Public Width As Integer
        Public Height As Integer
    End Structure
 
    'Структура описания битовой карты для GDI+
    <StructLayout(LayoutKind.Sequential)>
    Private Structure BITMAP_STRUCT
        Public bmType As Integer
        Public bmWidth As Integer
        Public bmHeight As Integer
        Public bmWidthBytes As Integer
        Public bmPlanes As Short
        Public bmBitsPixel As Short
        Public bmBits As IntPtr
    End Structure
 
    'Флаги управления извлечением изображений
    <Flags>
    Public Enum SIIGBF
        RESIZETOFIT = &H0
        BIGGERSIZEOK = &H1
        INMEMORYONLY = &H2
        ICONONLY = &H4
        THUMBNAILONLY = &H8
        INCACHEONLY = &H10
    End Enum
 
    ' COM-интерфейс IShellItemImageFactory
    <ComImport>
    <Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")>
    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    Private Interface IShellItemImageFactory
        <PreserveSig>
        Function GetImage(
        <MarshalAs(UnmanagedType.Struct)> ByVal size As NativeSize,
        ByVal flags As SIIGBF,
        <Out> ByRef phbm As IntPtr
    ) As Integer
    End Interface
 
    'Функция WinAPI для создания объекта ShellItem из пути к файлу
 
    <DllImport("shell32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Unicode)>
    Private Function SHCreateItemFromParsingName(
        <MarshalAs(UnmanagedType.LPWStr)> pszPath As String,
        pbc As IntPtr,
        ByRef riid As Guid,
        <Out> ByRef ppv As IntPtr
    ) As Integer ' HRESULT
    End Function
 
    'Функция для получения информации о HBITMAP (нужна для альфа-канала)
    <DllImport("gdi32.dll", SetLastError:=True)>
    Private Function GetObject(ByVal hObject As IntPtr, ByVal nCount As Integer, ByRef lpObject As BITMAP_STRUCT) As Integer
    End Function
 
    'Функция для освобождения памяти HBITMAP в GDI
    <DllImport("gdi32.dll", SetLastError:=True)>
    Private Function DeleteObject(ByVal ho As IntPtr) As Boolean
    End Function
 
    ''' <summary>
    ''' Возвращает миниатюру или иконку файла с сохранением прозрачности.
    ''' </summary>
    ''' <param name="filePath">Полный путь к файлу.</param>
    ''' <param name="width">Желаемая ширина в пикселях.</param>
    ''' <param name="height">Желаемая высота в пикселях.</param>
    ''' <returns>Объект Bitmap или Nothing в случае ошибки.</returns>
    Public Function GetFileThumbnail(filePath As String, width As Integer, height As Integer) As Bitmap
        Dim shellItemPtr As IntPtr = IntPtr.Zero
        Dim hBitmap As IntPtr = IntPtr.Zero
        Dim iidShellItemImageFactory As Guid = GetType(IShellItemImageFactory).GUID
 
        Try
            Dim hr As Integer = SHCreateItemFromParsingName(filePath, IntPtr.Zero, iidShellItemImageFactory, shellItemPtr)
            If hr <> 0 OrElse shellItemPtr = IntPtr.Zero Then Return Nothing
 
            Dim imageFactory As IShellItemImageFactory = CType(Marshal.GetTypedObjectForIUnknown(shellItemPtr, GetType(IShellItemImageFactory)), IShellItemImageFactory)
            Dim nativeSizeObj As New NativeSize() With {.Width = width, .Height = height}
 
            'Получаем thumbnail
            hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.RESIZETOFIT, hBitmap)
            If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
                'Если нет thumbnail, то берем иконку файла
                hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.ICONONLY, hBitmap)
                If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
                    Return Nothing
                End If
            End If
 
            Return GetBitmapWithAlpha(hBitmap)
 
        Finally
            If hBitmap <> IntPtr.Zero Then DeleteObject(hBitmap)
            If shellItemPtr <> IntPtr.Zero Then Marshal.Release(shellItemPtr)
        End Try
    End Function
 
    ''' <summary>
    ''' Вспомогательный метод для корректного переноса 32-битного HBITMAP с ARGB каналами
    ''' </summary>
    Private Function GetBitmapWithAlpha(hBitmap As IntPtr) As Bitmap
        Dim bmpObj As New BITMAP_STRUCT()
        If GetObject(hBitmap, Marshal.SizeOf(bmpObj), bmpObj) = 0 Then
            Return Bitmap.FromHbitmap(hBitmap) ' Fallback, если структуру не прочитать
        End If
 
        'Проверяем, является ли изображение 32-битным (содержит альфа-канал прозрачности)
        If bmpObj.bmBitsPixel = 32 AndAlso bmpObj.bmBits <> IntPtr.Zero Then
            Dim managedBitmap As New Bitmap(bmpObj.bmWidth, bmpObj.bmHeight, PixelFormat.Format32bppArgb)
            Dim bmpData As BitmapData = managedBitmap.LockBits(
                New Rectangle(0, 0, bmpObj.bmWidth, bmpObj.bmHeight),
                ImageLockMode.WriteOnly,
                PixelFormat.Format32bppArgb
            )
 
            'Копируем пиксели напрямую из памяти GDI в управляемый Bitmap
            Dim bytesToCopy As Integer = bmpObj.bmWidthBytes * bmpObj.bmHeight
            Dim buffer(bytesToCopy - 1) As Byte
            Marshal.Copy(bmpObj.bmBits, buffer, 0, bytesToCopy)
            Marshal.Copy(buffer, 0, bmpData.Scan0, bytesToCopy)
 
            managedBitmap.UnlockBits(bmpData)
            Return managedBitmap
        Else
            'Для обычных 24-битных картинок используем стандартный метод
            Return Bitmap.FromHbitmap(hBitmap)
        End If
    End Function
 
End Module
3
jump
 Аватар для I can
5005 / 4772 / 852
Регистрация: 13.04.2015
Сообщений: 10,027
31.07.2026, 10:18
Yury Komar, а у тебя код из этого поста Как получить миниатюру видеофайла? в какой конфигурации работает?

Добавлено через 50 секунд
Цитата Сообщение от Тим70 Посмотреть сообщение
все заработало
Оч хорошо
0
77 / 73 / 6
Регистрация: 11.04.2021
Сообщений: 304
Записей в блоге: 7
31.07.2026, 17:03
Тим70, это действительно работает?
0
Любитель
 Аватар для Тим70
1054 / 764 / 161
Регистрация: 27.01.2019
Сообщений: 1,543
31.07.2026, 17:09
edmonsur, Да,работает
Миниатюры
Как получить миниатюру видеофайла?  
1
77 / 73 / 6
Регистрация: 11.04.2021
Сообщений: 304
Записей в блоге: 7
31.07.2026, 19:00
Тим70, Тим70,у меня не работает... версия виндовс какая?
0
1550 / 1527 / 325
Регистрация: 03.10.2012
Сообщений: 1,558
31.07.2026, 21:59  [ТС]
I can, спасибо огромное! Работает! You can!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2026, 21:59

Как получить размеры кадра видеофайла?
Здравствуйте, уже долго пытаюсь найти ответ как можно получить информацию, а точнее расширение...

Как получить продолжительность видеофайла?
Как получить продолжительность видеофайла с помощью C#?

Получить поток видеофайла с сайта
Доброго времени суток. Поставлена задача получить поток указанного файла с сайта с видео. При...

Как сделать миниатюру изображения для предварительного просмотра в listview
Ну что бы как в проводнике Windows при включенных Эскизах.

Как оживить Slider, отслеживающий позицию видеофайла
Help! Перепробовал около десяти вариантов плееров – с триггерами, без триггеров, смешанные варианты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru