A
ArtBerry
Люди добрые, помогите разаобраться в содранной программе.
Содрал из урока. Но разобраться толком не могу. "Я ведь еще не волшебник, я только учусь...". А надо очень.
Прошу вас откликнитесь.
Вопрос такой: Нужно получить цвет пискеля из видео потока, открытого файла.
Если я правильно понимаю, то поток загружен в память, но ввиде каких данных мне непонятно. Мне говорили, что можно оперировать с data, для получения цветов пикселя, но я ни как не могу понять как? Сам не понял, что написал.
Вощем текст программы вот. А получить надо цвет пикселя.
// avi.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h> // Заголовочный файл Windows
#include <vfw.h> // Заголовочный файл для "Видео для Windows"
#using <mscorlib.dll>
using namespace System;
#pragma comment( lib, "vfw32.lib" ) // Искать VFW32.lib при линковке
#ifndef CDS_FULLSCREEN // CDS_FULLSCREEN не определяется некоторыми
#define CDS_FULLSCREEN 4 // компиляторами. Определяем эту константу
#endif // Таким образом мы можем избежать ошибок
AVISTREAMINFO psi; // Указатель на структуру содержащую информацию о
PAVISTREAM pavi; // Дескриптор для открытия потока
PGETFRAME pgf; // Указатель на объект GetFrame
BITMAPINFOHEADER bmih; // Заголовочная информация для DrawDibDraw декодирования
HDC hdc = CreateCompatibleDC(0); // Создание совместимого контекста устройства
unsigned char* data = 0; // Указатель на наше измененное в размерах изображение
char *pdata; // Указатель на данные текстуры
void OpenAVI(LPCSTR szFile) // Вскрытие AVI файла (szFile)
{
AVIFileInit(); // Открывает файл
// Открытие AVI потока
if (AVIStreamOpenFromFile(&pavi, szFile, streamtypeVIDEO, 0, OF_READ, NULL) !=0)
{
// Если ошибка
MessageBox (HWND_DESKTOP, "Failed To Open The AVI Stream", "Error", MB_OK | MB_ICONEXCLAMATION);
}
AVIStreamInfo(pavi, &psi, sizeof(psi)); // Записываем информацию о потоке в psi
pgf=AVIStreamGetFrameOpen(pavi, NULL); // Создание PGETFRAME с нужными нам параметрами
}
void GrabAVIFrame(int frame) // Захват кадра
{
LPBITMAPINFOHEADER lpbi; // Содержит BitmapInfoHeader
// Получение данных из потока
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
// Указатель на данные возвращенные AVIStreamGetFrame
// (Пропуск заголовка для получения указателя на данные)
pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);
//flipIt(data); // Перестановка красных и синих байтов
}
void CloseAVI(void) // Функция закрытия
{
DeleteObject(hBitmap); // Уничтожение устройства растра
DrawDibClose(hdd); // Закрытие контекста DrawDib устройства
AVIStreamGetFrameClose(pgf); // Закрытие объекта GetFrame
AVIStreamRelease(pavi); // Завершение потока
AVIFileExit(); // Закрытие файла
}
int _tmain()
{
OpenAVI("c:\\im20\\box.avi");
GrabAVIFrame(1);
CloseAVI();
//Console::WriteLine (data[2]);
Console::ReadLine ();
return 0;
}
Спасибо.
Содрал из урока. Но разобраться толком не могу. "Я ведь еще не волшебник, я только учусь...". А надо очень.
Прошу вас откликнитесь.
Вопрос такой: Нужно получить цвет пискеля из видео потока, открытого файла.
Если я правильно понимаю, то поток загружен в память, но ввиде каких данных мне непонятно. Мне говорили, что можно оперировать с data, для получения цветов пикселя, но я ни как не могу понять как? Сам не понял, что написал.
Вощем текст программы вот. А получить надо цвет пикселя.
// avi.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h> // Заголовочный файл Windows
#include <vfw.h> // Заголовочный файл для "Видео для Windows"
#using <mscorlib.dll>
using namespace System;
#pragma comment( lib, "vfw32.lib" ) // Искать VFW32.lib при линковке
#ifndef CDS_FULLSCREEN // CDS_FULLSCREEN не определяется некоторыми
#define CDS_FULLSCREEN 4 // компиляторами. Определяем эту константу
#endif // Таким образом мы можем избежать ошибок
AVISTREAMINFO psi; // Указатель на структуру содержащую информацию о
PAVISTREAM pavi; // Дескриптор для открытия потока
PGETFRAME pgf; // Указатель на объект GetFrame
BITMAPINFOHEADER bmih; // Заголовочная информация для DrawDibDraw декодирования
HDC hdc = CreateCompatibleDC(0); // Создание совместимого контекста устройства
unsigned char* data = 0; // Указатель на наше измененное в размерах изображение
char *pdata; // Указатель на данные текстуры
void OpenAVI(LPCSTR szFile) // Вскрытие AVI файла (szFile)
{
AVIFileInit(); // Открывает файл
// Открытие AVI потока
if (AVIStreamOpenFromFile(&pavi, szFile, streamtypeVIDEO, 0, OF_READ, NULL) !=0)
{
// Если ошибка
MessageBox (HWND_DESKTOP, "Failed To Open The AVI Stream", "Error", MB_OK | MB_ICONEXCLAMATION);
}
AVIStreamInfo(pavi, &psi, sizeof(psi)); // Записываем информацию о потоке в psi
pgf=AVIStreamGetFrameOpen(pavi, NULL); // Создание PGETFRAME с нужными нам параметрами
}
void GrabAVIFrame(int frame) // Захват кадра
{
LPBITMAPINFOHEADER lpbi; // Содержит BitmapInfoHeader
// Получение данных из потока
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
// Указатель на данные возвращенные AVIStreamGetFrame
// (Пропуск заголовка для получения указателя на данные)
pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);
//flipIt(data); // Перестановка красных и синих байтов
}
void CloseAVI(void) // Функция закрытия
{
DeleteObject(hBitmap); // Уничтожение устройства растра
DrawDibClose(hdd); // Закрытие контекста DrawDib устройства
AVIStreamGetFrameClose(pgf); // Закрытие объекта GetFrame
AVIStreamRelease(pavi); // Завершение потока
AVIFileExit(); // Закрытие файла
}
int _tmain()
{
OpenAVI("c:\\im20\\box.avi");
GrabAVIFrame(1);
CloseAVI();
//Console::WriteLine (data[2]);
Console::ReadLine ();
return 0;
}
Спасибо.