MCI表示について

[戻る]
海人 2008/07/24(木) 16:45:24
MCIで1024×256の動画ファイルを再生できるようになりました。
そこでこの1024×256のウインドウをボタンを押下することで700×200に
変更することにしました。
それに伴い、1024×256で表示されていた動画の一部分だけを700×200のウインドウに
表示させるようにしたいのですが、なにかよい方法はあるのでしょうか?
縮小とかではなく一部分の抜出です。
一部分というのは(0,0)のポイントではなく(150,30)のポイントからウイントウサイズ
700×200に合わせる為に(850,230)までを抜き出すという感じです。

開発環境はWin XP Visual Studio2005 VC++ MFCです。

subaru 2008/07/24(木) 17:28:03
mciSendCommandを使用している場合は
MCI_PUTでMCI_DGV_PUT_SOURCEとMCI_DGV_PUT_DESTINATIONの範囲を
適切に設定してやれば一部分のみ表示ができます。

海人 2008/07/24(木) 17:37:54
subaruさん有難うございます。

>>mciSendCommandを使用している場合
MCIWndCreate()を使用しているのですが・・・

かもねぎ 2008/07/24(木) 22:11:40
アプリでメッセージ処理できるように整えてやれば良いのでは?

金魚ちゃん 2008/07/24(木) 23:10:28
> MCIWndCreate()を使用しているのですが・・・
それならMCIウインドウのマクロ関数などを使う。

MCIWndGetSource()
MCIWndPutSource()
とか
MCIWndGetDest()
MCIWndPutDest()
など。

海人 2008/07/25(金) 13:26:50
金魚ちゃんさん
有難うございます。

>MCIWndGetSource()
>MCIWndPutSource()
>とか
>MCIWndGetDest()
>MCIWndPutDest()
を調べてみましたが、よいサンプルが見つかりませんでした。
具体的な使用方法などを提示していただけると幸いです。

海人 2008/07/25(金) 14:56:51
MCIWndGetSource()については若干HPに記載されていて、
MCIWndGetSource(hwnd,prc)ということは分かりました。
hwndにはMCIWndのハンドルでprcにはソース長方形のコーディネートを含むRECT構造への
ポインターをいれるということですが、
prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
の一部分を指定してやればいいのか分かりません。
どなたか教えて下さい。

宜しくお願いいたします。

subaru 2008/07/25(金) 17:53:38
>prc部にどうやって1024×256の動画ファイルの(150、30)のポインタから(850、230)まで
>の一部分を指定してやればいいのか分かりません。

RECT構造体の使い方がわからないのでしょうか?
MFC使用ということなのでCRect型の値でもいいですよ。

CRect rc(150, 30, 700, 200);
MCIWndPutSource(hwnd, rc);

海人 2008/07/25(金) 18:02:20
MCIWndGetSource()とMCIWndPutSource()を使ってコーディングしてみました。

///////////////略//////////////////

MCIWndGetSource(hAVIWnd,&rect);
rect.OffsetRect(150,30);
MCIWndPutSource(hAVIWnd,rect);

//////////////略//////////////////

これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
が、元画像と比較すると拡大表示されてしまっているんです。
これを拡大とか無しで元画像1024×256の一部(700×200)を抜き出したいのですが、
どのようにしたらよいでしょうか?
もちろん1024×256から一部分抜き出した際には、ビューウインドウは700×200に変更
しています。

海人 2008/07/25(金) 18:09:42
subaruさん
有難うございます。

subaruさんが提示してくれました方法でもやってみたのですが、
同様に拡大表示されてしまいました。

subaru 2008/07/25(金) 21:18:42
>これでやると(150,30)?のポイントから元画像の一部分のみの表示は可能になったのです
>が、元画像と比較すると拡大表示されてしまっているんです。

画像が拡大されてしまうのは、実際に画像を表示する範囲が適切に
設定されていないからです。
MCIWndPutSourceで設定された元画像の範囲が
MCIWndPutDestで設定された範囲に表示されるわけです。
今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。

海人 2008/08/04(月) 10:18:09
大変遅くなりましたが、
subaruさん
返信有難うございます。

>今回の場合は、MCIWndPutSourceで(150,30)-(850,230)の範囲を設定したあと
>同様にMCIWndPutDest()で(0,0)-(700,200)の範囲を設定してあげてください。

どのように範囲を設定すればよいのでしょうか?

海人 2008/08/04(月) 11:08:54
CRect rect(150,30,850,210);
MCIWndPutSource(hAVIWnd,rect);
CRect size(0,0,700,200);
MCIWndPutSource(hAVIWnd,size);
で出来るようになったのですが、
ボタンをもう一度押下で、元の1024×256のサイズに戻したいのですが、
うまくいきません。

初期化みたいなことはできるでしょうか?

subaru 2008/08/06(水) 23:19:30
どのようなコードを書いてどのように
うまくいかないのでしょうか?

一応実験してみました。

#include <windows.h>
#include <tchar.h>
#include <vfw.h>

#pragma comment(lib, "vfw32.lib")

int wmain()
{
    HWND hwnd = MCIWndCreate(NULL, GetModuleHandle(NULL), WS_VISIBLE,
        L"C:\\Users\\Public\\Videos\\Sample Videos\\bear.wmv");
    
    //初期値を取得
    RECT orgsrc;
    MCIWndGetSource(hwnd, &orgsrc);
    RECT orgdest;
    MCIWndGetDest(hwnd, &orgdest);
    
    //(100,100)-(400,400)の部分を再生
    RECT rect = {100, 100, 400, 400};
    MCIWndPutSource(hwnd, &rect);
    OffsetRect(&rect, -100, -100);
    MCIWndPutDest(hwnd, &rect);
    MCIWndPlay(hwnd);
    Sleep(5000);
    
    //元に戻す
    MCIWndPutSource(hwnd, &orgsrc);
    MCIWndPutDest(hwnd, &orgdest);
    Sleep(5000);
    
    MCIWndStop(hwnd);
    MCIWndClose(hwnd);
    MCIWndDestroy(hwnd);
    return 0;
}

古いスレッドには追加発言できません。