アクセスランキング 【C# Tips】自作スクリーンキャプチャソフトの記録 - C#

直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円(うち手取り11万)、家賃4万円で生活するひつじ人間。

【C# Tips】自作スクリーンキャプチャソフトの記録

 ネット上に投稿されてるC#のコードを流用して、自作キャプチャソフトを作ろうとした記録。オリジナル要素はほとんどなし。
 用途:アップされてる同人誌画像をファイル名連番で保存したい。


 結果:あんまり上手く行かなかった。→貼られてる画像のサイズがでか過ぎてはみ出る。









namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{


  #region イメージキャプチャ用変数
//using System.Drawing;

Rectangle r;
Bitmap bmp;   
Bitmap bmpNew;  //画像リサイズ用変数
Rectangle rect;  //クライアント座標取得用


#endregion

public string LoadPath;  //ファイル保存先パス設定用





public void CaptureFrame()
{
this.TransparencyKey = this.BackColor;

System.Threading.Thread.Sleep(50);
//フォーム移動時に若干取得が早過ぎるため



r = Screen.PrimaryScreen.Bounds;
//ディスプレイの範囲を取得

bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb);
//using System.Drawing.Imaging;
       



// 4.Graphicsオブジェクトの生成
var g = Graphics.FromImage(bmp);

      // 5.転送元の左上座標取得
var upperLeftSource = this.PointToScreen(new Point(0, 0));

// 6.転送先の左上座標取得
var upperLeftDestination = new Point(0, 0);


// 7.CopyFromScreenメソッドでキャプチャ
g.CopyFromScreen(
upperLeftSource, upperLeftDestination,
this.ClientSize, CopyPixelOperation.SourceCopy);


rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);

this.BackgroundImage = bmp;

  
}




    //メソッドのオーバーロード
// 同名のメソッドのシグネチャを変えている。
//こうすると、指定する値を変えるだけでメソッドを呼び出せる
     //同じ処理を複数記述する手間が省ける
public void CaptureFrame(Rectangle r)
{
LoadPath = System.IO.Directory.GetCurrentDirectory();
             //カレントディレクトリ取得用



   //この時点では、スクリーンの全体の範囲を取得しているため、クライアント領域を含む
   //黒い部分まで保存してしまう(この黒い部分は画像が取得出来なかった範囲を示す)
   //そこでフォームのクライアント領域と同じサイズにトリミングする
bmpNew = bmp.Clone(rect, bmp.PixelFormat);
                     //using System.Drawing.Imaging;が必要
       



bmpNew.Save(LoadPath + "\\Picture.jpg", ImageFormat.Jpeg);
// ファイル出力



}


//フォームのFormBoderStyleをSizebleにしておくと見栄えが良い。

private void Form1_Load(object sender, EventArgs e)
{

CaptureFrame();
 //フォームのクライアント領域を背景画像に設定するためのメソッド

this.AllowTransparency = false;
//フォームを不透明度調節をオフにする
}




//とりあえず三つほどフォームのイベントを追加しておく
private void Form3_Move(object sender, EventArgs e)
{
CaptureFrame();



this.AllowTransparency = false;

}


private void Form3_KeyDown(object sender, KeyEventArgs e)
//Form1のKeyPreviewプロパティをtrueにしておく

{
if (e.KeyCode == Keys.S)
{
CaptureFrame(r);


}
}



private void Form3_Resize(object sender, EventArgs e)
{


CaptureFrame();

this.AllowTransparency = false;




}

}




同人誌がでか過ぎて上手く取れない
関連記事
スポンサーサイト

 C#

 C#

3 Comments

あすぺるピロシ  

こんにちは

いつも有難うございます。遡って記事を拝見していましたが、折角なのでここから読ませてもらう事にします(;^ω^)
プログラムに関しましては【C言語の本】が押し入れに転がっていました。とにかく入力ミスが多くて/(^o^)\ナンテコッタイ状態で、興味はありましたが不向きだと思って放り投げました(汗)
あとは、【Objective C】の本も買ってもらい、macPCをいじってデベロッパーとか登録してやりましたが、数日で脳みそが\(^o^)/オワタになって、複数の本を知人に貸したままです(汗)そして数年が経っています。

自分の仕事場にはプログラムを作れる人間がいるのですが、彼に「プログラムの行動理論はとても簡単だ。選択肢を増やすだけだ」とか先日言われたばかりですw。何とか入力ミスさえなくなれば、僕もプログラミングの世界に入っては行きたいのですが・・・。
余談ですいません。
これもなにかの縁ですので、Sheephumanさんの記事をざっくり読ませて頂いて、自分なりの方向性を探すための参考にさせて頂きます(;^ω^)

2017/12/18 (Mon) 04:25 | REPLY |   

Sheephuman  

よろしかったら、最近の記事からお読みください

これは自分が製作中のものですが、こちらから読む事をお勧めします。
https://matome.naver.jp/odai/2148043611730634001

入力ミスは、Visual StudioみたいなIDE(開発環境)さえあれば格段に減ります。今時、テキストエディタでコンパイルもないでしょうし。

選択肢を増やすだけっていうのはそうですね。
If文で条件分岐したりするだけなんで。

 プログラミングはアルゴリズムと言って、ある目的を実現するために構築する一連の処理を記述するのですが、一つ一つ、筋道立てて読み解く論理性が問われるんですね。

 web上にあるソースコードだけでも、こういうノウハウがあるというのは学べるのですが、まずはそのアルゴリズム理解することです。

 

2017/12/18 (Mon) 04:34 | REPLY |   

あすぺるピロシ  

ありがとうございます

親切極まりない対応に感謝しております・・・(;^ω^)
時間は掛かると思いますが、しっかり活用させて頂きます。
現実世界もコンピュータの世界も「目標」をキチンと定める事が大切なんですね。僕の人生って結構適当でしたので・・・。
あ、FXの方は絶賛大炎上中なので近々記事になると思います。
ようやく時間が取れそうです。ありがとうございます。

2017/12/21 (Thu) 00:07 | REPLY |   

Leave a comment