備忘録

備忘録

.NET CoreでSystem.Drawingを使う

Ⅰ. はじめに

System.Drawing は WindowsのGDI+に依存している為、標準の.NET Coreで利用することができません。
解決策として System.Drawing.Common を使う方法を紹介します。
ただし、非推奨です。

Ⅱ. やり方

1. NuGetからインストールする
dotnet add package System.Drawing.Common
2. サンプルプログラムを書く
using System.Drawing;

var file = File.OpenRead("input.png");
#pragma warning disable CA1416
var bmp = new Bitmap(file);
bmp.Save("output.png");
#pragma warning restore
3. 実行結果


トラブルシューティング

Q. Linuxで実行すると以下のエラーが表示されます。
Unhandled Exception:
  System.TypeInitializationException:
  The type initializer for 'Gdip' threw an exception.
    ---> System.DllNotFoundException:
      Unable to load DLL 'libgdiplus': The specified module could not be found.

A. 以下手順を実行する必要があります

1. 以下のコマンドを実行してlibgdiplusをインストールする
apt install -y libgdiplus
2. プロジェクトルートにruntimeconfig.template.jsonを作成する
{
  "configProperties": {
    "System.Drawing.EnableUnixSupport": true
  }
}
3. csprojファイルを編集する
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
  </PropertyGroup>
</Project>
4. 発行する
dotnet publish -c Release

WindowsでPOCO C++をビルドして使う

f:id:kagasu:20170702192622p:plain
https://pocoproject.org/

Ⅰ. はじめに

「POCO C++」はモダンで強力なC++ライブラリです。

等の機能があります。
f:id:kagasu:20170702192612p:plain

Ⅱ. 1つづつビルドする方法

1. ソースコードをダウンロードします。

https://pocoproject.org/

2. Foundationの場合「Foundation_x64_vs150.sln」を開きます。

Testは不要なのでアンロードさせます。
f:id:kagasu:20170702193601p:plain

3. ビルドをクリックでビルドできます。

Ⅲ. まとめてビルドする方法

1. 「VS 2017用x86_x64 Cross Tools コマンドプロンプト」を起動する


2. 以下のコマンドを実行

Windows SDKバージョンのエラーがでる場合は「*.vcxproj」ファイルの WindowsTargetPlatformVersion を適切に設定して下さい。
※NetSSL_OpenSSLとCryptoをビルドする場合はOpenSSLを事前にビルドする必要があります。参考

VS2015の場合はNuGetから「openssl.v140.windesktop.msvcstl.static.rt-dyn」をインストールする事でも解決できます。

cd c:\poco-1.7.9-all\
buildwin.cmd 150 build static_mt release x64 nosamples notests msbuild

Ⅲ. POCOの使い方

2. ヘッダのインクルードディレクトリとlibのディレクトリを設定する

f:id:kagasu:20170702193940p:plain

3. サンプルを実行する

f:id:kagasu:20170702194059p:plain

Windows 10 ナビゲーションウィンドウの邪魔なフォルダを消す

Ⅰ.はじめに

私個人としては「ビデオ」「ピクチャ」「ドキュメント」といったフォルダは頻繁に使用しないため非常に邪魔です。

消し方

1. 以下のテキストをx.regという名前をつけて保存し、実行する。
Windows Registry Editor Version 5.00

; Desktop
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]
; Download
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{088e3905-0323-4b02-9826-5d99428e115f}]
; Picture
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]
; Music
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]
; Document
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{d3162b92-9365-467a-956b-92703aca08af}]
; Video
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]
; 3D Object (Windows 1709 or later only)
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]
2. 邪魔な項目が消えます。


C#でテンプレートマッチを行う

Ⅰ. はじめに

OpenCV3 のラッパーである OpenCvSharp の MatchTemplate メソッドを使ってテンプレートマッチを行います。

Ⅱ. サンプル

スクリーンショットを取り、メモ帳のアイコンを探すサンプルです。

NuGet から OpenCV3 のラッパーをインストールする。

f:id:kagasu:20170609192018p:plain

Install-Package OpenCvSharp3-AnyCPU
template.png

f:id:kagasu:20170609191705p:plain

Program.cs
class Program
{
  /// <summary>
  /// スクリーン全体のスクリーンショットを撮る
  /// </summary>
  static Bitmap TakeFullScreenScreenShot(int width, int height)
  {
    var bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);
    //var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    using (var g = Graphics.FromImage(bmp))
    {
      g.CopyFromScreen(0, 0, 0, 0, bmp.Size);
    }

    return bmp;
  }

  /// <summary>
  /// テンプレートマッチを行う
  /// </summary>
  static (OpenCvSharp.Point minPoint, OpenCvSharp.Point maxPoint) MatchTemplate()
  {
    var screen = BitmapConverter.ToMat(TakeFullScreenScreenShot(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
    var template = BitmapConverter.ToMat(new Bitmap("template.png"));

    var result = new Mat();
    Cv2.MatchTemplate(screen, template, result, TemplateMatchModes.CCoeffNormed);
    Cv2.Threshold(result, result, 0.8, 1.0, ThresholdTypes.Binary);
    Cv2.MinMaxLoc(result, out OpenCvSharp.Point minPoint, out OpenCvSharp.Point maxPoint);

    //screen.Rectangle(maxPoint, new OpenCvSharp.Point(maxPoint.X + template.Width, maxPoint.Y + template.Height), Scalar.Red);
    //screen.SaveImage("out.bmp");
    
    return (minPoint, maxPoint);
  }

  static void Main(string[] args)
  {
    MatchTemplate();
  }
}

Ⅲ. 実行結果

メモ帳ウィンドウの左上のアイコンのテンプレートマッチに成功し、四角い枠が付いています。
f:id:kagasu:20170609191434p:plain

Ⅳ. エラー対策

ハンドルされていない例外:
OpenCvSharp.OpenCVException:
(depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2

Windowsに標準でインストールされているペイントで画像をpng形式で保存した場合、
アルファ値の有無が変わる場合があります。(なぜ変わるか、詳細はよく分かってないです)
PixelFormat を適切に設定すると解決します。

Windows で touch を使う

Ⅰ. はじめに

Windows に touch コマンドは存在しません。

Ⅱ. やり方

type nul > hoge.txt

これは以下のコマンドに相当します。

touch hoge.txt