Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
19th
Сен
DirectShow отзеркалить или перевернуть изображение
Posted by obzor under Delphi
Как, используя DirectShow, отзеркалить или перевернуть изображение? Есть ли для этого какой-нибудь интерфейс или фильтр?
Если делать это через SampleGrabberCallback, то видео тормозит.
Покажите ваш код где идет обработка кадра в sampleGraberCallback, чтобы немного подправить
Я у себя в проекте с видео переворачивал картинку кадра таким вот способом, очень быстро получается
OutPict:= изображение оригинальное
InPict:= разворачиваем изображение как нужно
For Y:= biHeight - 1 downto 0 do
begin
Move(OutPict^, InPict[Y*biWidth], biWidth);
INC(PByte(OutPict), biWidth);
end;
Я уже давно заметил, что работая с изображением в реальном времени нельзя напрямую работать с ним без сторонних графических хендлов и буфера, т. к. их можно незаметно подчищать, тем самым нет наложения изображения и нет разных глюков.
Тормозило как я заметил из за Canvas.StretchDraw по этой причине росла память, перегружался процессора видимо было наложения картинки т.к. конва не очищалась.
Вот кое что изменил у меня работает норм.
function TVideoPlayer.SampleCB(SampleTime: Double; pSample: IMediaSample): HResult;
var
BitmapInfoHeader: PBitmapInfoHeader;
MediaType: TAMMediaType;
DIBSize, ByteWidth, Y: Integer;
pBuffer: array of byte;
pPixel: array of byte;
bmp: TBitmap;
iPix: integer;
begin
if Assigned(OnGrabVideoSample) then
begin
if (pSample.GetSize = 0) then
Exit;
Result := pVideoGrabber.GetConnectedMediaType(MediaType);
if Failed(Result) then
Exit;
if IsEqualGUID(MediaType.majortype, MEDIATYPE_Video) then
begin
BitmapInfoHeader := NIL;
if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
begin
if (MediaType.cbFormat >= SizeOf(TVideoInfoHeader)) then
BitmapInfoHeader := @(PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
end;
if (BitmapInfoHeader = NIL) then
Exit;
DIBSize := BitmapInfoHeader^.biSizeImage;
if (DIBSize = 0) then
begin
with BitmapInfoHeader^ do
DIBSize := 3 * biWidth * biHeight * biPlanes;
BitmapInfoHeader^.biSizeImage := DIBSize;
end;
pSample.GetPointer(PByte(pBuffer));
bmp:= TBitmap.Create;
bmp.PixelFormat:= pf24bit;
bmp.Width:= BitmapInfoHeader.biWidth;
bmp.Height:= BitmapInfoHeader.biHeight;
try
ByteWidth := BitmapInfoHeader.biWidth * 3;
SetLength(pPixel, DIBSize);
//Обрабатываем кадр как нам нужно
for y := BitmapInfoHeader.biWidth * BitmapInfoHeader.biHeight - 1 downto 0 do
begin
PByteArray(pPixel)^[y * 3] := PByteArray(pBuffer)^[0];
PByteArray(pPixel)^[y * 3 + 1] := PByteArray(pBuffer)^[1];
PByteArray(pPixel)^[y * 3 + 2] := PByteArray(pBuffer)^[2];
INC(PByte(pBuffer), 3);
end;
//Копируем через буфер кадр в Bitmap
iPix:= 0;
for y := 0 to BitmapInfoHeader.biHeight - 1 do
begin
Move(PByteArray(pPixel)[iPix], bmp.ScanLine[Y]^, ByteWidth);
INC(iPix, ByteWidth);
end;
OnGrabVideoSample(Self, bmp);
finally
bmp.Free;
end;
Result := S_OK;
end;
end;
end;
procedure TEventsHandler.PlayerGrabVideoSample(Sender: TObject; Bitmap: TBitmap);
var
memDC, FDC: HDC;
begin
MemDC:= GetDC(Panel1.Handle); //Читаем графический хендел панели
SetStretchBltMode(MemDC, HALFTONE); //Сглаживаем фон на графическом хенделе панели
FDC:= CreateCompatibleDC(MemDC); //Создаем графический хендел из графического хендела панели для работы Bitmap
SelectObject(FDC, Bitmap.Handle);//Привязываем к созданному графическому хенделу Bitmap
//Рисуем на графическом хенделе панели из привязанного созданного графического хендла Bitmap
StretchBlt(MemDC, 0, 0, Panel1.Width, Panel1.Height, FDC, 0, 0, Bitmap.Width, Bitmap.Height, SRCCOPY);
//Удаляем все графические хендлы
DeleteDC(FDC);
DeleteDC(MemDC);
//Все это нужно для правильного рисования кадра и для освобождения ресурсов
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)