Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/28: Рейтинг темы: голосов - 28, средняя оценка - 4.96
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3

Из avi-файла достать интересующий frame

04.11.2008, 14:15. Показов 5912. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Люди, помогите, пожалуйста.


Я работаю в Borland Builder 6.
Задача довольно то пустяковая, но возникли некие проблемы. Надо всего лишь из AVI файла достать интересующий frame и вставить его в , а точнее просто вывести например в Image1->…..
Перерыл кучу кодингов, что-то нашёл , стал использовать и модифицировать,(и представьте себе) что-то получилось, но (честно говоря) ведь это же через ж…. То что хотел и именно как хотел не получается.

C++
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
#include <vcl.h>
#pragma hdrstop
#include <vfw.h>
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
        AVISTREAMINFO    psi;       // Указатель на структуру содержащую информацию о потоке
        PAVISTREAM       pavi;      // Дескриптор для открытия потока
        PGETFRAME        pgf;       // Указатель на объект GetFrame
        long             lastframe; // Последний кадр анимации
        int              width;     // Ширина видео
        int              height;    // Высота видео
        char             *pdata;    // Указатель на данные текстуры
        int              mpf;       // Сколько миллисекунд отображен кадр
        HBITMAP       hBitmap;      // Дескриптор устройства растра
        HDC hdc;                    // Создание совместимого контекста устройства
        unsigned char* data;        // Указатель на наше измененное в размерах изображение
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
       AVIFileInit();
 
       if( AVIStreamOpenFromFile(&pavi,"c:\\9.avi" , streamtypeVIDEO, 0, OF_READ, NULL) != 0)
       {
                Panel1->Caption = "AVIStreamOpenFromFile Error" ;
                return;
       }
       else
       {
                Panel1->Caption = "AVIStreamOpenFromFile OK" ;
       }
 
    AVIStreamInfo(pavi, &psi, sizeof(psi));   // Записываем информацию о потоке в psi
    width = psi.rcFrame.right-psi.rcFrame.left; // Ширина = правая граница минус левая
    height = psi.rcFrame.bottom-psi.rcFrame.top;// Высота равна верх минус низ
    lastframe = AVIStreamLength(pavi);          // Последний кадр потока
    mpf = AVIStreamSampleToTime(pavi,lastframe)/lastframe;
 
 
    pgf = AVIStreamGetFrameOpen(pavi, NULL); // Создание PGETFRAME с нужными нам параметрами
 
    if (pgf==NULL)
    {
        Panel2->Caption = "AVIStreamGetFrameOpen Error"  ;
        return;
    }
    else
    {
        Panel2->Caption = "AVIStreamGetFrameOpen OK" ;
    }
 
        LPBITMAPINFOHEADER lpbi;      // Содержит BitmapInfoHeader
 
 
        int frame = 270; //какой-то кадр
 
        lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
 
        pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);
 
 
   HDC DC_Handle;
    DC_Handle = CreateDC("Display",0,0,0);
 
    ::StretchDIBits     (
 
                        DC_Handle,          // hDC
                        0,                     // DestX
                        0,                     // DestY
                        lpbi->biWidth,      // nDestWidth
                        lpbi->biHeight,     // nDestHeight
                        0,                     // SrcX
                        0,                     // SrcY
                        lpbi->biWidth,      // wSrcWidth
                        lpbi->biHeight,     // wSrcHeight
                        pdata,                  // lpBits
                        (LPBITMAPINFO)lpbi, // lpBitsInfo
                        DIB_RGB_COLORS,        // wUsage
                        SRCCOPY                 // dwROP
                                        
                        );
 
 
        DWORD color = GetPixel(DC_Handle,120,120);
        int R = GetRValue(color);
        int G = GetGValue(color);
        int B GetBValue(color);
 
        Panel3->Caption = FloatToStr(R)+","+ FloatToStr(G)+","+ FloatToStr(B);
 
          int i,j;
          for (int i =0;i<320;i++)
          {
                for  (int j =0;j<255;j++)
 
               Image1->Canvas->Pixels[i][j] = GetPixel(DC_Handle,i,j);
          }
 
 
}
Теперь, прочитав код, Вы наверное видите, что это коряво. Прога сначала выводит frame на экран, а потом оттуда уже попиксельно вытаскивает его и вставляет в Image1->…..
У меня получилось так, потому что ЭЭЭ…по другому у меня никак не получалось. Я никак не пойму как обратиться и к чему обратиться, что бы оперировать множеством битов нужного фрейма. Что бы просто взять эту структуру и всадить в (например) Image1->…..->Bitmap…. Может быть я не прав и ход размышлений должен быть другим??? Помогите!?? Я пробовал использовать и следующую возможность:

C++
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
HDRAWDIB      hdd;        // Дескриптор для нашего рисунка
 
HBITMAP       hBitmap;    // Дескриптор устройства растра
 
HDC hdc = CreateCompatibleDC(0); // Создание совместимого контекста устройства
 
unsigned char* data = 0;         // Указатель на наше измененное в размерах изображение
 
BITMAPINFOHEADER bmih;      // Заголовочная информация для DrawDibDraw декодирования
 
 
 
//////////////////////////Ниже не уверен, что очень правильно/////////////////
 
 
 
 bmih.biSize        = sizeof (BITMAPINFOHEADER); // Размер BitmapInfoHeader’а
 
  bmih.biPlanes      = 1;       // Размер
 
  bmih.biBitCount    = 24;      // Формат битов
 
  bmih.biWidth       = 256;     // Ширина(256 пикселов)
 
  bmih.biHeight      = 256;     // Высота(256 пикселов)
 
  bmih.biCompression = BI_RGB;  // Цветовой режим (RGB)
 
 
  hBitmap = CreateDIBSection (hdc, (BITMAPINFO*)(&bmih),
 
                              DIB_RGB_COLORS, (void**)(&data), NULL, NULL);
 
  SelectObject (hdc, hBitmap) ;  // Выбор hBitmap в наш контекст устройства (hdc)
 
 
 DrawDibDraw (hdd, hdc, 0, 0, 256, 256, lpbi, pdata, 0, 0, width, height, 0);
 
       int i,j;
          for (int i =0;i<320;i++)
          {
                for  (int j =0;j<255;j++)
 
               Image1->Canvas->Pixels[i][j] = GetPixel(hBitmap,i,j);
          }
Но в итоге черный квадрат в Image1. Возможно, я неправильно пользуюсь hBitmap как hdc. Возможно, им надо пользоваться по-другому, но как???, у меня не получается. В прочтенных кодингах встречал много разных функций, и вроде бы они по описанию подходят, но в конечном итоге не получается.

Помогите!???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2008, 14:15
Ответы с готовыми решениями:

Как достать html code из frame/iframe (ie), если изменился source?
hie! есть проблема: хочу достать хтмл из iframe's &lt;body &gt; - в принципе, могу: function doit(){ ifra=document.all.iframename ...

Как программно добавить Frame в другой существующий на форме frame?
Делаю это так: На форме лежит Frame1. на инициализации формы.... Dim mFrame As Object

Websocket frame: Как правильно построить frame byte array?
Доброго дня. Пытаюсь написать свою имплементацию Websocket, но застрял на построении frame. Вот структура frame согласно спецификации...

14
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 14:32
Ну чтобы не выводить на дисплей достаточно CreateCompatibleDC вызвать и создать контекст в памяти устройства. Оттуда ты можешь все нарисовать в Image легко.
Для того, чтобы с битмапом потом дела провернуть есть две хорошие функции: CreateCompatibleBitmap, BitBlt.
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 15:41  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
Ну чтобы не выводить на дисплей достаточно CreateCompatibleDC вызвать и создать контекст в памяти устройства. Оттуда ты можешь все нарисовать в Image легко.
Для того, чтобы с битмапом потом дела провернуть есть две хорошие функции: CreateCompatibleBitmap, BitBlt.
Спасибо попробую функции :CreateCompatibleBitmap, BitBlt .

А вот как ??? // создать контекст в памяти устройства
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 15:42
Вот я и говорю CreateCompatibleDC c параметром NULL создает мемори контекст. А там в памяти с ним делай, что хочешь: рисуй, копируй и т. д.
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 16:13  [ТС]
То есть Вы имеете ввиду вместо

C++
1
2
HDC DC_Handle;
    DC_Handle = CreateDC("Display",0,0,0);
Использовать

C++
1
HDC hdc = CreateCompatibleDC(0);
И потом вместо DC_Handle использовать hdc
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 16:43  [ТС]
CreateCompatibleBitmap() возвращает HBITMAP т.е. return value is a handle to the bitmap.

Но что потом мне делать с этим handle ?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 16:58
Да ты и без битмапа можешь обойтись. Если у тебя есть в памяти DC, то сразу рисуй его на имэйдже. Можешь данные копировать через BitBlt, или если ты взял с фрейма массив с данными битмапа, то SetDIBits
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 17:36  [ТС]
как.... рисуй сразу на Image ?

Так

Code
1
Image1->Canvas->Draw(0,0, [B]а сюда то, что возвращает SetDIBits [/B])
Или

[CODE]Image1->Canvas->Brush->Bitmap->]а сюда то, что возвращает SetDIBits[CODE]


или как ?

Если нетрудно подскажи последний, конечный шаг каким должен быть??

Как всё таки вывести в Image и что вывести Image1->Canvas->Brush->Bitmap->.......
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 17:48
Нарисуй через StretchDIBits. Тольк первым параметром передай DC своего Image. Тогда на нем нарисуется твой фрейм.
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 17:53  [ТС]
Я об этом уже думал, только вот вопрос

как возвратить DC моего Image
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 17:56
В свойствах посмотри. Я с билдером не работаю. Насколько я помню, у любой байды там канва есть, а хэндл (Handle) у канвы и есть HDC. Билдер - зло
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 18:00  [ТС]
Ну что же пойду попробую

Спасибо за советы!!!


А ты в чем кодишь??? В Visual Studio ????
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.11.2008, 18:10
Не. В gcc
0
 Аватар для pronin
0 / 0 / 0
Регистрация: 03.09.2014
Сообщений: 3
04.11.2008, 18:13  [ТС]
Ещё раз спасибо.


Удачи
0
sapmail
05.02.2013, 20:02
разобрались? у меня такая-же задача, перевести avi и кадры...
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2013, 20:02
Помогаю со студенческими работами здесь

Нужно из кусков разных фильмов (avi, mpg) создать один avi
Такая задача. Нужно из кусков разных фильмов (avi, mpg) создать один avi. Помогите кто чем может.

Передача информации из одного Frame в другой Frame
Здравствуйте! У меня следующий вопрос: На окне есть первый Frame в котором несколько страниц. На одной из страниц первого Frame, а...

Сжатие AVI файла
Здравствуйте. Столкнулся с проблемкой. Я пробую записать Image в AVI файл. Использую AForge.Video.VFW; Все вроде бы хорошо,...

Раскодирование AVI-файла
Доброго времени суток! Ситуация следующая: ф-и библиотеки vfw, а именно, AviStreamRead не раскодируют более 2-х ГБ. Читал форумы,...

Извлечение кадров из *.avi файла
нужно извлечь кадры из *.avi файла делаю так: // izvlechenie_cadra.cpp: определяет точку входа для консольного приложения. // ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru