tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2446
投稿日: 2005/10/20(Thu) 15:36
投稿者開発初心者
参照先http://trick-seed.hp.infoseek.co.jp/code.zip
[OSのVer]:Windows XP pro    [VBのVer]:VB.NET 2002
はじめまして。私は大学でvb.NETを利用して卒業研究をしているものです。vb.netをはじめて、まだ
1ヶ月しか経っていません。
早速、質問なのですが。フォーム上の画像を1秒間隔でJPEG方式に保存しようとしているのですが、
'System.NullReferenceException' のハンドルされていない例外が 間隔撮影.exe で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
と、エラーが出てしまいます。いろいろと調べたのですが分かりませんでした。教えて頂けないでし
ょうか。お願い致します。コードはhhttp://trick-seed.hp.infoseek.co.jp/code.zipにアップしてお
きました。

[ツリー表示へ]
タイトルRe: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2448
投稿日: 2005/10/23(Sun) 15:08
投稿者YAS
[OSのVer]:Windows    [VBのVer]:VB.NET  
開発初心者さん,卒業研究ご苦労様です。

(注:私も初心者みたいなものなので,用語や言葉遣いが正確でありません。)

NullReferenceExceptionはオブジェクトの実体がなく,参照がNothingのままの
ときに発生するのだと思います。

>iData = Clipboard.GetDataObject()
ここでクリップボードからデータを取れていなくてiDataがNothingのまま
だからではないでしょうか?

>img = CType(iData.GetData(DataFormats.Bitmap), Image)
iDataの実体がないのにiDataオブジェクトを使おうとしているのでエラーに
なるのだと思います。

原因は,タイマーから呼び出されるintervalPictureがタイマーを作成したスレッド
とは別のシステムが提供したスレッドで動作しているためだと思います。
この別スレッドからはクリップボードにアクセスできないのだと思います。
そこでデリゲートを使い,次のようなコードにすればメインスレッドに戻ってクリップ
ボードにアクセスできると思います。お試しください。

    Private Sub intervalPicture(ByVal state As Object)
        Dim i As Integer
        Dim img As Image
        For i = 0 To 9
            ' [Alt]キーを押す
            keybd_event(vbKeyMenu, 0, KEYEVENTF_EXTENDEDKEY, 0)
            ' [PrintScreen]キーを押す
            keybd_event(vbKeySnapshot, 0, KEYEVENTF_EXTENDEDKEY, 0)
            ' [PrintScreen]キーを離す
            keybd_event(vbKeySnapshot, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
            ' [Alt]キーを離す
            keybd_event(vbKeyMenu, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
            ' タイミングの調整
            Application.DoEvents()
            ' クリップボードからフォームの画像を取得
            Dim dlg As New GetClipBoardDelegate(AddressOf GetClipBoard)
            img = Me.Invoke(dlg)
            'ビットマップデータ形式に関連付けられているデータを取得
            If Not (img Is Nothing) Then
                img.Save("CaptureImage" + i.ToString + ".JPEG", _
                         System.Drawing.Imaging.ImageFormat.Jpeg)
            End If
        Next
        End
    End Sub

    Delegate Function GetClipBoardDelegate() As Image

    Private Function GetClipBoard() As Image
        ' クリップボードからフォームの画像を取得
        Dim iData As IDataObject = Clipboard.GetDataObject()
        Dim img As Image = CType(iData.GetData(DataFormats.Bitmap), Image)
        'クリップボードから削除
        Clipboard.SetDataObject(New DataObject())
        Return img
    End Function

[ツリー表示へ]
タイトルRe^2: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2449
投稿日: 2005/10/25(Tue) 14:13
投稿者開発初心者
参照先http://trick-seed.hp.infoseek.co.jp/code.zip
YASさん、ありがとうございます。
うまくいきました。

[ツリー表示へ]
タイトルRe^3: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2450
投稿日: 2005/10/25(Tue) 14:24
投稿者YAS
[OSのVer]:Windows    [VBのVer]:VB.NET  
> YASさん、ありがとうございます。
> うまくいきました。

わたしもバックグラウンドで走っているスレッドからフォームの
コントロールにアクセスする方法を調べているところだったので,
応用できました。

別スレッドからコントロールにアクセスするとエラーになるのに
クリップボードの場合には黙ってデータをよこさないので原因が
なかなかわかりませんよね。解決してよかったです。

[ツリー表示へ]
タイトルRe^4: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2452
投稿日: 2005/10/25(Tue) 15:42
投稿者開発初心者
参照先http://trick-seed.hp.infoseek.co.jp/code.zip
[OSのVer]:Windows XP pro    [VBのVer]:VB.NET2002
また、問題が生じてしまいました。
どうしても、処理にかかる時間のせいで正確に1秒間隔に画像を保存することができませんでした。
なので、1秒間隔に保存することをあきらめました。しかし、連続して画像を保存し続けることができま
せん。
50枚連続ならうまく保存できるのですが、100枚連続して保存しようとすると途中でiDataの値があるの
にもかかわらず、imgに代入することができません。また、コードを(hhttp://trick-
seed.hp.infoseek.co.jp/code.zip)にアップしておきましたので、どなたか解決案を示して頂けないで
しょうか。お願い致します。
右下のtextBoxに撮影枚数を記入し開始を押しますと、連続してキャプチャーして画像を保存することが
できます。また、右側のrichTextBoxに現在保存されている枚数が表示されます。
途中で動かなくなりましたら中断を押して終了して下さい。

[ツリー表示へ]
タイトルRe^5: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2460
投稿日: 2005/10/26(Wed) 03:19
投稿者YAS
[OSのVer]:Windows    [VBのVer]:VB.NET  
私のマシンだとうまくいってしまいます。
Pen4 2.8GHz,1Gbyteのマシンです。
タスクマネージャを見ると瞬間的に100Mbyte程のメモリ使用量になること
があるようなので,メモリが足りなかったりするのではないでしょうか。
img,mybitmap,gをループの中で宣言したりdisposeしたりすればメモリの
使用量を減らすことができると思います。
まったく見当違いのアドバイスをしている可能性が高いですが、お試し
ください。

また,タイマーですが,精度が必要ならマルチメディアタイマーを使うと
よいと思います。
タイマーコントロールよりもだいぶ正確だったはずです。

[ツリー表示へ]
タイトルRe^6: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2476
投稿日: 2005/10/27(Thu) 18:30
投稿者 
GCが間に合ってないかもしれませんね。
MyBitmap.Dispose()など、使ったオブジェクトはDisposeしておいてください。

[ツリー表示へ]
タイトルRe^6: フォームの画像を1秒おきに、JPEG形式に保存する方法
記事No2490
投稿日: 2005/10/31(Mon) 16:52
投稿者開発初心者
[OSのVer]:Windows XP pro    [VBのVer]:VB.NET 2002
img,mybitmap,gをループの中で宣言したりdisposeしたり下のですが解決できませんでした。
私のパソコンはベアボーンでCPU(2.3GHz)、メモリ(512MB)、HDD(80GB)、ディスクドライブを付けただけ
という簡単なものです。
研究室のノートパソコンでは実行できたので、おそらくはビデオメモリが足りていないような気がしま
す。教授に頼んで購入してもらおうと思います。

[ツリー表示へ]