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

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

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

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

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

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

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

46
Любитель
 Аватар для Тим70
1074 / 786 / 161
Регистрация: 27.01.2019
Сообщений: 1,552
01.08.2026, 01:53
Студворк — интернет-сервис помощи студентам
edmonsur, NET.Framework 4.8
Windows 7
0
Любитель
 Аватар для Тим70
1074 / 786 / 161
Регистрация: 27.01.2019
Сообщений: 1,552
01.08.2026, 02:15
Вот попробуйте
Вложения
Тип файла: rar Миниатюра Yury Komar.rar (60.6 Кб, 7 просмотров)
2
1550 / 1527 / 325
Регистрация: 03.10.2012
Сообщений: 1,558
01.08.2026, 21:41  [ТС]
edmonsur, этот код, судя по документации, должен работать на любой версии винды, начиная с висты. А используемые функции из фреймворка есть даже в FW1.1
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,267
03.08.2026, 09:23
Тим70, заметил, что при выборе файла, не имеющего миниатюры, возвращается иконка, но отзеркаленная и перевернутая Почему так, пока не пойму.
0
84 / 80 / 6
Регистрация: 11.04.2021
Сообщений: 319
Записей в блоге: 7
03.08.2026, 13:53
Yury Komar, Большинство иконок в Windows хранятся в формате, где первая строка пикселей соответствует верхней части изображения. Это так называемый формат "сверху вниз" (top-down).

Стандарт для GDI: Однако GDI, который используется для работы с HBITMAP (аппаратно-зависимыми растровыми изображениями), часто ожидает формат "снизу вверх" (bottom-up). В этом формате первая строка пикселей соответствует нижней части изображения.

Как это связано с кодом: Когда вы запрашиваете иконку через IShellItemImageFactory.GetImage с флагом SIIGBF.ICONONLY, Windows, скорее всего, возвращает HBITMAP в том формате, в котором иконка хранится в системе (т.е. "сверху вниз"). код затем использует Bitmap.FromHbitmap для создания управляемого объекта Bitmap. Этот метод, по умолчанию, интерпретирует данные HBITMAP как GDI-растровое изображение "снизу вверх", отсюда и эффект зеркального отражения и переворота. При этом, как вы и заметили, для миниатюр такой проблемы нет, потому что они, вероятно, возвращаются в правильной ориентации. простейшее решение RotateFlip.
1
Любитель
 Аватар для Тим70
1074 / 786 / 161
Регистрация: 27.01.2019
Сообщений: 1,552
03.08.2026, 14:54
Цитата Сообщение от Yury Komar Посмотреть сообщение
возвращается иконка, но отзеркаленная и перевернутая
Да так и есть ,но по совету edmonsur, достаточно сделать
VB.NET
1
myPic.RotateFlip(RotateFlipType.RotateNoneFlipY)
,только надо понять,что вернулась иконка,а не миниатюра,
Тут видимо нужно флаг Boolean использовать,пока не придумал как.
0
84 / 80 / 6
Регистрация: 11.04.2021
Сообщений: 319
Записей в блоге: 7
03.08.2026, 14:56
Лучший ответ Сообщение было отмечено Тим70 как решение

Решение

Тим70,


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
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
 
Public Module ShellThumbnailHelper
 
    <StructLayout(LayoutKind.Sequential)>
    Private Structure NativeSize
        Public Width As Integer
        Public Height As Integer
    End Structure
 
    <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
 
    <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
 
    <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
    End Function
 
    <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
 
    <DllImport("gdi32.dll", SetLastError:=True)>
    Private Function DeleteObject(ByVal ho As IntPtr) As Boolean
    End Function
 
    ''' <summary>
    ''' Возвращает миниатюру или иконку файла.
    ''' Если это иконка, автоматически применяется RotateNoneFlipY.
    ''' </summary>
    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
        Dim isIcon As Boolean = False
 
        Try
            Dim hr As Integer = SHCreateItemFromParsingName(filePath, IntPtr.Zero, iidShellItemImageFactory, shellItemPtr)
            If hr <> 0 OrElse shellItemPtr = IntPtr.Zero Then
                Return Nothing
            End If
 
            Dim imageFactory As IShellItemImageFactory = TryCast(Marshal.GetTypedObjectForIUnknown(shellItemPtr, GetType(IShellItemImageFactory)), IShellItemImageFactory)
            If imageFactory Is Nothing Then Return Nothing
 
            Dim nativeSizeObj As New NativeSize() With {.Width = width, .Height = height}
 
            ' !!!!!!!!!!!!! Пытаемся получить именно эскиз (THUMBNAILONLY) !!!!!!!!!!!!
            hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.THUMBNAILONLY Or SIIGBF.BIGGERSIZEOK, hBitmap)
            If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
                ' Если эскиз отсутствует, берём иконку
                hr = imageFactory.GetImage(nativeSizeObj, SIIGBF.ICONONLY, hBitmap)
                If hr <> 0 OrElse hBitmap = IntPtr.Zero Then
                    Return Nothing
                End If
                isIcon = True
            End If
 
            Dim result As Bitmap = GetBitmapWithAlpha(hBitmap)
            If result Is Nothing Then Return Nothing
 
            ' !!!!!!!!!!!!! Если это иконка, применяем RotateNoneFlipY !!!!!!!!!!!!!!!
            If isIcon Then
                result.RotateFlip(RotateFlipType.RotateNoneFlipY)
            End If
 
            Return result
 
        Finally
            If hBitmap <> IntPtr.Zero Then DeleteObject(hBitmap)
            If shellItemPtr <> IntPtr.Zero Then Marshal.Release(shellItemPtr)
        End Try
    End Function
 
    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)
        End If
 
        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
            )
            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
            Return Bitmap.FromHbitmap(hBitmap)
        End If
    End Function
End Module
уже сделал... уже работает
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2026, 14:56

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru