- 投稿日:2021-06-23T22:06:47+09:00
System.Drawing.Bitmap から SoftwareBitmap を取得する方法 & C#/WinRT で OCR やってみた - クリップボードから取得版
1. System.Drawing.Bitmap から SoftwareBitmap を取得する方法 2-1. ソースコード の MakeSoftwareBitmap メソッドの処理で実現可能。 1-1. SoftwareBitmap をプログラムから生成する方法(参考サイト) ビットマップ画像の作成、編集、保存 - UWP applications | Microsoft Docs 2. C#/WinRT で OCR やってみた - クリップボードから取得版 2-1. ソースコード 以下、C#/WinRT で OCR やってみた - Qiitaからの派生 ※SoftwareBitmap側 の RGB の順序が合っているかは裏どりしていない。 using System; using System.IO; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Collections.Generic; using System.Threading.Tasks; using Windows.Graphics.Imaging; using Windows.Media.Ocr; using Windows.Storage; using Windows.Storage.Streams; using Windows.Foundation; class OcrTest { [System.STAThread] static void Main(string[] args) { System.Drawing.Image img = System.Windows.Forms.Clipboard.GetImage(); if (img != null) { var bmp = (System.Drawing.Bitmap)img; // 例外が発生する可能性あり SoftwareBitmap softBmp = MakeSoftwareBitmap(bmp); Task<string> ret = LoadImageAndOcr(softBmp); Console.WriteLine(ret.Result); } } [ComImport] [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] unsafe interface IMemoryBufferByteAccess { void GetBuffer(out byte* buffer, out uint capacity); } static SoftwareBitmap MakeSoftwareBitmap(System.Drawing.Bitmap bmp) { unsafe { var softwareBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, bmp.Width, bmp.Height, BitmapAlphaMode.Premultiplied); System.Drawing.Imaging.BitmapData bd = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte* pSrc = (byte*)bd.Scan0; using (BitmapBuffer buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Write)) { using (var reference = buffer.CreateReference()) { byte* pDest; uint capacity; ((IMemoryBufferByteAccess)reference).GetBuffer(out pDest, out capacity); // Fill-in the BGRA plane BitmapPlaneDescription bl = buffer.GetPlaneDescription(0); for (int y = 0; y < bl.Height; y++) { int blOffset = bl.StartIndex + y*bl.Stride; int yb = y*bd.Stride; for (int x = 0; x < bl.Width; x++) { pDest[blOffset + 4*x ] = pSrc[yb + 4*x ]; // blue pDest[blOffset + 4*x + 1] = pSrc[yb + 4*x + 1]; // green pDest[blOffset + 4*x + 2] = pSrc[yb + 4*x + 2]; // red pDest[blOffset + 4*x + 3] = (byte)255; // alpha } } } } bmp.UnlockBits(bd); return softwareBitmap; } } static async Task<OcrResult> detect(SoftwareBitmap bitmap) { var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages(); var ocrResult = await MyWaitUtil<OcrResult>.GetResultWithWaiting( ocrEngine.RecognizeAsync(bitmap) ); // https://docs.microsoft.com/ja-jp/uwp/api/windows.media.ocr.ocrresult.lines?view=winrt-19041 return ocrResult; } static async Task<string> LoadImageAndOcr(SoftwareBitmap softwareBitmap) { OcrResult t = await detect(softwareBitmap); return t.Text; } } public static class MyWaitUtil<T> { public static async Task<T> GetResultWithWaiting(IAsyncOperation<T> task) { while ( task.Status != AsyncStatus.Completed ) { if ( task.Status == AsyncStatus.Error || task.Status == AsyncStatus.Canceled ) { Console.WriteLine("Error or Canceled"); return default(T); } await Task.Delay(1); }; return task.GetResults(); } }
- 投稿日:2021-06-23T17:50:44+09:00
UnrealEngine用に作ったのツール類まとめ
コンテントブラウザ上のアセットをブックマークしておくエディタ拡張プラグイン UE_LOGの挙動をプロジェクトごとに変えづらいので作ったロガープラグイン 毎度お作法に応じたUCLASS書くの面倒なので一発で吐いてくれる.exe ガベコレ対策.exe
- 投稿日:2021-06-23T14:51:34+09:00
C# OpenDocumentをパワーポイントに変換
OpenDocument(オープンドキュメント)とは、XMLをベースとしたオフィススイート用のファイルフォーマットです。今日はSpire.Presentationという無料のライブラリを使って、OpenDocumentをパワーポイントに変換する方法を紹介します。 下準備 1.E-iceblueの公式サイトからFree Spire. Presentation無料版をダウンロードしてください。 2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. Presentation.dllを参照に追加してください。 (Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→Presentation.dll”というようになります。) using Spire.Presentation; namespace odptoPDF { class Program { static void Main(string[] args) { //ファイルをロードします。 Presentation presentation = new Presentation(); presentation.LoadFromFile("Sample.odp",FileFormat.ODP); // OpenDocumentファイルで保存します。 presentation.SaveToFile("OdptoPDF.pdf",FileFormat.PDF); } } } 実行結果
- 投稿日:2021-06-23T14:46:50+09:00
C# WordをPCLに変換
一般的にはPCLと呼ばれるPrinter Command Languageは、ヒューレットパッカード社によってプリンタプロトコルとして開発されたページ記述言語(PDL)であり、事実上の業界標準となっています。今回はFree Spire.Doc for .NETという無料のライブラリを使って、ただ三行のコードでWordをPCLに変換する方法を紹介します。 下準備 1.E-iceblueの公式サイトからFree Spire.Doc for .NET無料版をダウンロードしてください。 2. Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいDoc.dllを参照に追加してください。(Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→Spire.Doc.dll”というようです。) using Spire.Doc; namespace DOCPCL { class Program { static void Main(string[] args) { //ファイルをロードします。 Document doc = new Document(); doc.LoadFromFile("Sample.docx", FileFormat.Docx2010); //PCLファイルで保存します。 doc.SaveToFile("Result.pcl", FileFormat.PCL); } } }