Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Изменение размера изображения...

6.1K
05 апреля 2006 года
Devider
28 / / 24.12.2004
Получаю картинку с камеры. Пытаюсь программно выставить формат 720х480. Он ДОЛЖЕН поддерживаться. Использую DShowNET (с codeproject.com). Привиденное ниже никакого эффекта не дает. Помогите выставить нужный размер!..
Guid cat;
Guid med;
int hr;
object o;
cat = PinCategory.Capture;
med = MediaType.Video;
Guid iid = typeof(IAMStreamConfig).GUID;
//CaptureGrafBuilder
hr = captureGraphBuilder.FindInterface(
ref cat, ref med, videoDeviceFilter, ref iid, out o);
IAMStreamConfig pConfig = o as IAMStreamConfig;
IntPtr pmtConfig;
pConfig.GetFormat(out pmtConfig);
AMMediaType mtConfig = (AMMediaType)Marshal.PtrToStructure(pmtConfig, typeof(AMMediaType));
VideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mtConfig.formatPtr, typeof(VideoInfoHeader));
videoInfoHeader.BmiHeader.Width = 720;
videoInfoHeader.BmiHeader.Height = 480;
pConfig.SetFormat(mtConfig);
6.1K
21 апреля 2006 года
Devider
28 / / 24.12.2004
Пробовал такой вариант:
Код:
bool IsMatchedConfigcaps(VideoStreamConfigCaps  Caps,  AMMediaType MediaType,int SizeX, int SizeY)
                {
                        bool result=/*Guid.Equals(MediaType.majorType, ) &&
                                                ((Guid.Equals(MediaType.subType, MediaSubType.RGB24)) ||
                                                 (Guid.Equals(MediaType.subType, MediaSubType.RGB24)))*/
                                                true;
                        if (result)
                        {
                                result=(SizeX>=Caps.MinOutputSize.Width) &&  (SizeX<=Caps.MaxOutputSize.Width) &&
                                           (SizeY>=Caps.MinOutputSize.Height) &&  (SizeY<=Caps.MaxOutputSize.Height);
                        }
                        if (result) RCount++;
                        Debug.WriteLine("result = "+result.ToString());
                        return result;
                }
                static int RCount = 0;
                void SetPreviewFormat(int w,int h)
                {
                        object o;
                        DsGuid cap = PinCategory.Capture;
                        DsGuid med = MediaType.Interleaved;
                        DsGuid iid = typeof(IAMStreamConfig).GUID;
                        int we = 768;
                        int he = 576;
                        bool bInterLeaved = (captureGraphBuilder.FindInterface(cap, med, sourceFilter, iid, out o) == 0);
                        Debug.WriteLine ("Interleaved: "+bInterLeaved.ToString());
           
                        med = MediaType.Video;
                        bInterLeaved = (captureGraphBuilder.FindInterface(cap, med, sourceFilter, iid, out o) == 0);
                        Debug.WriteLine ("Video: " + bInterLeaved.ToString());
            IAMStreamConfig iStreamConf = o as IAMStreamConfig;
                        Debug.WriteLine ("iStrConf == null: " + (iStreamConf == null).ToString());
                       
                        int CapCount, CapSize;
                        iStreamConf.GetNumberOfCapabilities(out CapCount, out CapSize);
                        Debug.WriteLine("Capcount == " + CapCount.ToString());
                        for (int i = 0; i < CapCount; i++)
                        {
                                AMMediaType curMedType;
                                VideoStreamConfigCaps scc;
                                IntPtr pscc;
                                try
                                {
                                        pscc = Marshal.AllocCoTaskMem( Marshal.SizeOf( typeof( VideoStreamConfigCaps ) ) );
                                }
                                catch (Exception e)
                                {
                                        MessageBox.Show(e.Message);
                                        return;
                                }
                                int hr = iStreamConf.GetStreamCaps(i,out curMedType, pscc);
                                Marshal.ThrowExceptionForHR(hr);
                                scc = (VideoStreamConfigCaps)Marshal.PtrToStructure(pscc,typeof(VideoStreamConfigCaps));

       
                                if (IsMatchedConfigcaps(scc,curMedType, we, he))
                                {
                                        if (DsGuid.Equals(curMedType.formatType, FormatType.VideoInfo))
                                        {
                                                VideoInfoHeader vh = (VideoInfoHeader) Marshal.PtrToStructure(curMedType.formatPtr, typeof(VideoInfoHeader));
                                                Debug.WriteLine("VideoInfoHeader == null : "+(vh==null).ToString());
                                                vh.TargetRect = new DsRect(0,0,we,he);
                                                vh.BmiHeader.Width = we;
                                                vh.BmiHeader.Height = he;
                                                Debug.WriteLine("FormatType.VideoInfo");
                                        }
                                        else if (DsGuid.Equals(curMedType.formatType, FormatType.VideoInfo2))
                                        {
                                                VideoInfoHeader2 vh = (VideoInfoHeader2) Marshal.PtrToStructure(curMedType.formatPtr, typeof(VideoInfoHeader2));
                                                Debug.WriteLine((vh==null).ToString());
                                                vh.TargetRect = new DsRect(0,0,we,he);
                                                vh.BmiHeader.Width = we;
                                                vh.BmiHeader.Height = he;
                                                Debug.WriteLine("FormatType.VideoInfo2");
                                        }
                                        hr = iStreamConf.SetFormat(curMedType);
                                        Debug.WriteLine("SetFormat: "+hr.ToString());
                                        Marshal.FreeCoTaskMem(pscc);
                                        if (hr == 0)
                                        {
                                                break;
                                        }
                                }
                        }
                        Debug.WriteLine("RCount == "+RCount.ToString());
                }

Получаю на это вот что:
Interleaved: False
Video: True
iStrConf == null: False
Capcount == 256
result = False
result = False
result = True
VideoInfoHeader == null : False
FormatType.VideoInfo
SetFormat: 0
RCount == 1
А разрешение нужное не выставляется... Вообще, кто-нибудь делал подобное на C#?
273
30 апреля 2006 года
3A3-968M
1.2K / / 22.12.2005
Я использовал ActiveX компонент MS Media Player чтобы воспроизводить картинку к Web-камеры
6.1K
02 мая 2006 года
Devider
28 / / 24.12.2004
Цитата:
Originally posted by 3A3-968M
Я использовал ActiveX компонент MS Media Player чтобы воспроизводить картинку к Web-камеры


Спасибо, разобрался. Примерно так, если кому вдруг не дай Бог понадобится =) :

Код:
int w = 720;
            int h = 576;
            object o;
            if (videoDeviceFilter == null)
            {
                Debug.WriteLine("videoDeviceFilter == null");
                return;
            }
            Guid pin = PinCategory.Preview;
            Guid med = MediaType.Video;
            Guid iams = typeof(IAMStreamConfig).GUID;
            int hr = captureGraphBuilder.FindInterface(ref pin, ref med, videoDeviceFilter, ref iams , out o);
            Marshal.ThrowExceptionForHR(hr);
            IAMStreamConfig sc = o as IAMStreamConfig;
            IntPtr ptr;
            AMMediaType mt;
            hr = sc.GetFormat(out ptr);
            mt = (AMMediaType)Marshal.PtrToStructure(ptr, typeof(AMMediaType));


            Marshal.ThrowExceptionForHR(hr);
            ptr = mt.formatPtr;
            VideoInfoHeader vh = (VideoInfoHeader)Marshal.PtrToStructure(ptr, typeof(VideoInfoHeader));
            Debug.WriteLine("vh == null: " + (vh == null).ToString());
            Debug.WriteLine("vh.BmiHeader.ImageSize == " + vh.BmiHeader.ImageSize.ToString());
            Debug.WriteLine("vh.BmiHeader.Size == " + vh.BmiHeader.Size.ToString());
            vh.BmiHeader.Width = w;
            vh.BmiHeader.Height = h;
            Marshal.StructureToPtr(vh, ptr, false);
            mt.formatPtr = ptr;
            hr = sc.SetFormat(mt);
            Marshal.ThrowExceptionForHR(hr);
33K
10 октября 2007 года
Mikepol
1 / / 10.10.2007
Devider, спасибо большое ! Очень помог пример.
Единственное в рунете, пожалуй :)
62K
25 декабря 2010 года
manitor
4 / / 31.07.2010
Для этого есть хорошая программа - Изменение размера картинки.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог