From 4801d4d90ed152566f5c6b3a2c1963a343ed2b00 Mon Sep 17 00:00:00 2001 From: cssho Date: Thu, 5 Nov 2026 20:59:47 +0900 Subject: [PATCH] =?UTF-8?q?.NET=20Standard=202.0=20=E3=81=B8=E7=A7=BB?= =?UTF-8?q?=E8=A1=8C=E3=81=97=E3=80=81=E6=8F=8F=E7=94=BB=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=AA=E3=82=92=E9=81=B8=E3=81=B9=E3=82=8B?= =?UTF-8?q?=E6=A7=8B=E6=88=90=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - コア(ZipConvertCustomerBarCode)を依存なしの netstandard2.0 に変更し、 バー配置の取得(GetBars)と SVG 出力を追加 - System.Drawing 版(ZipConvertCustomerBarCode.Drawing)と SkiaSharp 版(ZipConvertCustomerBarCode.SkiaSharp)の描画パッケージを追加 - シンボル画像(GIF/resx)をバー配置の表に置き換え - csproj を SDK 形式に変更し、sln を作り直し - LibExecuter を削除し、xUnit のテストプロジェクトを追加 (1.x の出力とシンボル列・画像がピクセル単位で一致することを確認) - README と CLAUDE.md を更新 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01HNb8H3ydQTR8dWU8d28osE --- CLAUDE.md | 29 +- Directory.Build.props | 10 + LibExecuter/LibExecuter.csproj | 64 ---- LibExecuter/Program.cs | 14 - LibExecuter/Properties/AssemblyInfo.cs | 36 --- README.md | 65 ++++- .../CustomerBarCodeDrawingExtensions.cs | 49 ++++ .../ZipConvertCustomerBarCode.Drawing.csproj | 17 ++ .../CustomerBarCodeSkiaExtensions.cs | 61 ++++ ...ZipConvertCustomerBarCode.SkiaSharp.csproj | 18 ++ .../BarCodeTests.cs | 54 ++++ .../CustomerBarCodeTests.cs | 92 ++++++ .../DrawingRenderTests.cs | 59 ++++ .../SkiaRenderTests.cs | 60 ++++ ZipConvertCustomerBarCode.Tests/TestCases.cs | 26 ++ .../TestData/cases.tsv | 20 ++ .../TestData/v1-0.png | Bin 0 -> 444 bytes .../TestData/v1-1.png | Bin 0 -> 472 bytes .../TestData/v1-10.png | Bin 0 -> 420 bytes .../TestData/v1-11.png | Bin 0 -> 404 bytes .../TestData/v1-12.png | Bin 0 -> 471 bytes .../TestData/v1-13.png | Bin 0 -> 490 bytes .../TestData/v1-14.png | Bin 0 -> 494 bytes .../TestData/v1-15.png | Bin 0 -> 493 bytes .../TestData/v1-17.png | Bin 0 -> 433 bytes .../TestData/v1-18.png | Bin 0 -> 432 bytes .../TestData/v1-19.png | Bin 0 -> 465 bytes .../TestData/v1-2.png | Bin 0 -> 444 bytes .../TestData/v1-21.png | Bin 0 -> 372 bytes .../TestData/v1-3.png | Bin 0 -> 461 bytes .../TestData/v1-4.png | Bin 0 -> 397 bytes .../TestData/v1-5.png | Bin 0 -> 419 bytes .../TestData/v1-6.png | Bin 0 -> 425 bytes .../TestData/v1-7.png | Bin 0 -> 499 bytes .../TestData/v1-8.png | Bin 0 -> 427 bytes .../TestData/v1-9.png | Bin 0 -> 392 bytes .../ZipConvertCustomerBarCode.Tests.csproj | 26 ++ ZipConvertCustomerBarCode.sln | 84 ++++-- ZipConvertCustomerBarCode/Bar.cs | 58 ++++ ZipConvertCustomerBarCode/BarCode.cs | 64 +--- ZipConvertCustomerBarCode/CustomerBarCode.cs | 132 +++++++++ .../Properties/AssemblyInfo.cs | 36 --- .../Properties/Resources.Designer.cs | 273 ------------------ .../Properties/Resources.resx | 184 ------------ ZipConvertCustomerBarCode/Resources/-.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/0.gif | Bin 64 -> 0 bytes ZipConvertCustomerBarCode/Resources/1.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/2.gif | Bin 16230 -> 0 bytes ZipConvertCustomerBarCode/Resources/3.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/4.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/5.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/6.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/7.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/8.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/9.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/c1.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/c2.gif | Bin 64 -> 0 bytes ZipConvertCustomerBarCode/Resources/c3.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/c4.gif | Bin 65 -> 0 bytes ZipConvertCustomerBarCode/Resources/c5.gif | Bin 64 -> 0 bytes ZipConvertCustomerBarCode/Resources/c6.gif | Bin 64 -> 0 bytes ZipConvertCustomerBarCode/Resources/c7.gif | Bin 64 -> 0 bytes ZipConvertCustomerBarCode/Resources/c8.gif | Bin 61 -> 0 bytes ZipConvertCustomerBarCode/Resources/e.gif | Bin 66 -> 0 bytes ZipConvertCustomerBarCode/Resources/s.gif | Bin 66 -> 0 bytes .../ZipConvertCustomerBarCode.csproj | 94 +----- global.json | 5 + 67 files changed, 838 insertions(+), 792 deletions(-) create mode 100644 Directory.Build.props delete mode 100644 LibExecuter/LibExecuter.csproj delete mode 100644 LibExecuter/Program.cs delete mode 100644 LibExecuter/Properties/AssemblyInfo.cs create mode 100644 ZipConvertCustomerBarCode.Drawing/CustomerBarCodeDrawingExtensions.cs create mode 100644 ZipConvertCustomerBarCode.Drawing/ZipConvertCustomerBarCode.Drawing.csproj create mode 100644 ZipConvertCustomerBarCode.SkiaSharp/CustomerBarCodeSkiaExtensions.cs create mode 100644 ZipConvertCustomerBarCode.SkiaSharp/ZipConvertCustomerBarCode.SkiaSharp.csproj create mode 100644 ZipConvertCustomerBarCode.Tests/BarCodeTests.cs create mode 100644 ZipConvertCustomerBarCode.Tests/CustomerBarCodeTests.cs create mode 100644 ZipConvertCustomerBarCode.Tests/DrawingRenderTests.cs create mode 100644 ZipConvertCustomerBarCode.Tests/SkiaRenderTests.cs create mode 100644 ZipConvertCustomerBarCode.Tests/TestCases.cs create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/cases.tsv create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-0.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-1.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-10.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-11.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-12.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-13.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-14.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-15.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-17.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-18.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-19.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-2.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-21.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-3.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-4.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-5.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-6.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-7.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-8.png create mode 100644 ZipConvertCustomerBarCode.Tests/TestData/v1-9.png create mode 100644 ZipConvertCustomerBarCode.Tests/ZipConvertCustomerBarCode.Tests.csproj create mode 100644 ZipConvertCustomerBarCode/Bar.cs create mode 100644 ZipConvertCustomerBarCode/CustomerBarCode.cs delete mode 100644 ZipConvertCustomerBarCode/Properties/AssemblyInfo.cs delete mode 100644 ZipConvertCustomerBarCode/Properties/Resources.Designer.cs delete mode 100644 ZipConvertCustomerBarCode/Properties/Resources.resx delete mode 100644 ZipConvertCustomerBarCode/Resources/-.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/0.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/1.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/2.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/3.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/4.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/5.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/6.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/7.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/8.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/9.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c1.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c2.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c3.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c4.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c5.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c6.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c7.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/c8.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/e.gif delete mode 100644 ZipConvertCustomerBarCode/Resources/s.gif create mode 100644 global.json diff --git a/CLAUDE.md b/CLAUDE.md index 4cee5ab..44bc5db 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,24 +6,31 @@ - 日本向けのライブラリなので、ユーザーとのやり取り・ドキュメント(README、CLAUDE.md など)・コードコメント・XML ドキュメントコメント・コミットメッセージはすべて日本語で書く。 -## ビルド +## 構成・ビルド -- プロジェクトは旧形式(非 SDK スタイル)の csproj で、ターゲットは .NET Framework 4.0(`LibExecuter` は 4.0 Client Profile)。`dotnet build` ではビルドできないため、Visual Studio の MSBuild を使う: - `"/c/Program Files/Microsoft Visual Studio/2022/Community/MSBuild/Current/Bin/MSBuild.exe" ZipConvertCustomerBarCode.sln -nologo -v:m` -- 現在この環境では .NET Framework 4.0 の参照アセンブリ(Developer Pack)がないため、MSB3644 でビルドが失敗する。その場合はエラーを報告し、ユーザーの指示なしに `TargetFrameworkVersion` を変更しない。 -- コードは .NET Framework 4.0 の API の範囲で書く(`IReadOnlyList` や `Task.Run` などは使えない)。 +- ライブラリは 3 つ、すべて `netstandard2.0`(SDK スタイル)。ビルドは `dotnet build ZipConvertCustomerBarCode.sln`。 + - `ZipConvertCustomerBarCode`: コア。外部依存を追加しない(描画ライブラリに依存させないのが分割の目的)。 + - `ZipConvertCustomerBarCode.Drawing`: System.Drawing.Common による描画(Windows のみ)。 + - `ZipConvertCustomerBarCode.SkiaSharp`: SkiaSharp による描画。名前空間は `SkiaSharp` との衝突を避けるため `ZipConvertCustomerBarCode.Skia`。 +- `netstandard2.0` の既定 C# は 7.3。`record` や null 許容参照型など新しい構文は使わない。 +- バージョン・著作権表示は `Directory.Build.props` にまとめている。 +- 公開メンバーには XML ドキュメントコメントを付ける(`GenerateDocumentationFile` 有効のため、ないと警告になる)。 ## テスト -- テストプロジェクトはない。`LibExecuter` はサンプル住所で `BarCode.CreateImage` を呼ぶだけのコンソールアプリで、結果は手動で確認する。 +- `dotnet test` で実行(xUnit v3、net10.0)。`global.json` で Microsoft.Testing.Platform を指定しているため、`Microsoft.NET.Test.Sdk` や `xunit.runner.visualstudio` は追加しない。 +- `TestData/cases.tsv` と `v1-*.png` は 1.x(.NET Framework 版)の出力で、シンボル列と画像がこれとピクセル単位で一致することを確認している。出力が変わる修正をした場合は、意図した変更か確認してから期待値を更新する。 +- `cases.tsv` はタブ区切り(郵便番号・住所・シンボル列・画像ファイル名)。住所が空の行があるので、シェルで加工するときは連続するタブがまとめられないよう注意する。 +- System.Drawing のテストは Windows 以外ではスキップされる。 ## コード規約 -- `.cs` ファイルは UTF-8(BOM 付き)・CRLF 改行。どちらも維持する。 +- `.cs` ファイルは UTF-8(BOM 付き)・CRLF 改行。どちらも維持する(新規ファイルにも BOM を付ける)。 -## バーコード処理(`ZipConvertCustomerBarCode/BarCode.cs`) +## バーコード処理 -- 住所の変換は日本郵便のバーコードマニュアル(http://www.post.japanpost.jp/zipcode/zipmanual/p19.html)に従う。コード中の番号付きコメント(1.〜6.)はマニュアルの手順番号に対応している。 -- バーコードは常に 23 シンボル: スタート + 郵便番号 7 桁 + 住所表示番号 13 枠(不足分は `CC4` で埋める)+ チェックデジット + ストップ。各シンボルは幅 12px の GIF なので画像サイズは 276×12。シンボル数を変える場合は `new Bitmap(276, 12)` も合わせて変更する。 -- シンボル画像は `ZipConvertCustomerBarCode/Resources/*.gif`。`ImageKeyDic` が各シンボルをリソース名(`Num0`、`Hyphen`、`CC1`、`Start`、`End` など)に対応付けている。リソース名はファイル名ではなく `Properties/Resources.resx` と `Resources.Designer.cs` で定義されているため、画像を追加するときは両方を更新する。 +- 住所の変換(`BarCode.cs`)は日本郵便のバーコードマニュアル(http://www.post.japanpost.jp/zipcode/zipmanual/p19.html)に従う。コード中の番号付きコメント(1.〜6.)はマニュアルの手順番号に対応している。 +- バーコードは常に 23 シンボル: スタート + 郵便番号 7 桁 + 住所表示番号 13 枠(不足分は `CC4` で埋める)+ チェックデジット + ストップ。 +- バーの形は `CustomerBarCode.cs` の `BarPatternDic` で定義(1 シンボル = 幅 12px に 3 本、x=0/4/8、幅 2px、上・中・下段 各 4px)。この表は旧バージョンの GIF 画像とピクセル単位で一致することを確認済みなので、変更するときは既存出力と比較する。 +- 描画パッケージは `GetBars()` の矩形を白地に黒で塗るだけにし、バーコードのロジックはコアに置く。 - 住所中の漢数字には未対応(README に記載の既知の制限)。 diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..fc534f5 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,10 @@ + + + + 2.0.0 + Toshiba + ZipConvertCustomerBarCode + Copyright © Toshiba 2015 + + + diff --git a/LibExecuter/LibExecuter.csproj b/LibExecuter/LibExecuter.csproj deleted file mode 100644 index 99f48e4..0000000 --- a/LibExecuter/LibExecuter.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {73611104-9843-44A5-835D-F9BBA7D9001C} - Exe - Properties - LibExecuter - LibExecuter - v4.0 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - {af6583cf-653d-42f8-a286-526d9a8ebf03} - ZipConvertCustomerBarCode - - - - - \ No newline at end of file diff --git a/LibExecuter/Program.cs b/LibExecuter/Program.cs deleted file mode 100644 index f026d86..0000000 --- a/LibExecuter/Program.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Drawing; -using ZipConvertCustomerBarCode; - -namespace LibExecuter -{ - class Program - { - - static void Main(string[] args) - { - Bitmap img = BarCode.CreateImage("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); - } - } -} diff --git a/LibExecuter/Properties/AssemblyInfo.cs b/LibExecuter/Properties/AssemblyInfo.cs deleted file mode 100644 index 5d82075..0000000 --- a/LibExecuter/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("LibExecuter")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Toshiba")] -[assembly: AssemblyProduct("LibExecuter")] -[assembly: AssemblyCopyright("Copyright © Toshiba 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから -// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です -[assembly: Guid("7764069b-6507-4368-959d-3e7c8ad0f084")] - -// アセンブリのバージョン情報は、以下の 4 つの値で構成されています: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/README.md b/README.md index e5e2e22..99d5ea5 100644 --- a/README.md +++ b/README.md @@ -7,20 +7,67 @@ [郵便局 - 郵便番号・バーコードマニュアル](http://www.post.japanpost.jp/zipcode/zipmanual/index.html) -## 機能 -### Export -指定したパスにカスタマバーコードを出力する。 +## 構成 +すべて .NET Standard 2.0 のライブラリです。描画方法に合わせてパッケージを選んでください。 + +| プロジェクト | 依存 | 用途 | +| --- | --- | --- | +| `ZipConvertCustomerBarCode` | なし | バーコード生成、バー配置の取得、SVG 出力 | +| `ZipConvertCustomerBarCode.Drawing` | System.Drawing.Common | `Bitmap` として描画(Windows のみ) | +| `ZipConvertCustomerBarCode.SkiaSharp` | SkiaSharp | `SKBitmap` / PNG として描画(クロスプラットフォーム) | + +SkiaSharp を Linux で使う場合は、利用側で `SkiaSharp.NativeAssets.Linux` パッケージも参照してください。 + +## 使い方 +### バーコード生成 ```csharp -// 郵便番号,住所,出力先 -BarCode.Export("01234567", "とある県とある市とある町 1丁目1の1",@"c:\test.gif"); +using ZipConvertCustomerBarCode; + +// 郵便番号,住所 +CustomerBarCode code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); ``` -### CreateImage -カスタマバーコードのイメージを返す +郵便番号が7桁の数値でない場合は `ArgumentException` になります。 + +### SVG(依存ライブラリなし) ```csharp -// 郵便番号,住所 -Bitmap img = BarCode.CreateImage("01234567", "とある県とある市とある町 1丁目1の1"); +string svg = code.ToSvg(); +``` + +### System.Drawing +```csharp +using ZipConvertCustomerBarCode.Drawing; + +Bitmap img = code.ToBitmap(); +code.Save(@"c:\test.gif", ImageFormat.Gif); ``` +### SkiaSharp +```csharp +using ZipConvertCustomerBarCode.Skia; + +SKBitmap img = code.ToSKBitmap(); +byte[] png = code.ToPng(); +code.SavePng(@"c:\test.png"); +``` + +### 独自に描画する +`GetBars()` でバーの位置と大きさ(ピクセル単位)が取れるので、任意の描画ライブラリで白地に黒の矩形を描いてください。 + +```csharp +foreach (var bar in code.GetBars()) +{ + // bar.X, bar.Y, bar.Width, bar.Height +} +``` + +いずれのメソッドも `scale` 引数で拡大できます(1 のとき 276×12 ピクセル)。 + +## 1.x からの移行 +| 1.x | 2.x | +| --- | --- | +| `BarCode.CreateImage(zip, address)` | `BarCode.Create(zip, address).ToBitmap()`(Drawing) | +| `BarCode.Export(zip, address, path)` | `BarCode.Create(zip, address).Save(path, ImageFormat.Gif)`(Drawing) | + ## 備考 * 漢数字未対応 * 住所→郵便番号変換辞書検討中(郵便番号の入力が不要に) diff --git a/ZipConvertCustomerBarCode.Drawing/CustomerBarCodeDrawingExtensions.cs b/ZipConvertCustomerBarCode.Drawing/CustomerBarCodeDrawingExtensions.cs new file mode 100644 index 0000000..91d7363 --- /dev/null +++ b/ZipConvertCustomerBarCode.Drawing/CustomerBarCodeDrawingExtensions.cs @@ -0,0 +1,49 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; + +namespace ZipConvertCustomerBarCode.Drawing +{ + /// + /// System.Drawing によるカスタマバーコードの描画 + /// + public static class CustomerBarCodeDrawingExtensions + { + /// + /// カスタマバーコードのイメージを返す + /// + /// カスタマバーコード + /// 拡大率(1で1シンボル12ピクセル) + /// バーコードイメージ + public static Bitmap ToBitmap(this CustomerBarCode code, int scale = 1) + { + if (code == null) throw new ArgumentNullException(nameof(code)); + + var img = new Bitmap(code.GetWidth(scale), code.GetHeight(scale)); + using (var gr = Graphics.FromImage(img)) + { + gr.Clear(Color.White); + foreach (var bar in code.GetBars(scale)) + { + gr.FillRectangle(Brushes.Black, bar.X, bar.Y, bar.Width, bar.Height); + } + } + return img; + } + + /// + /// 指定したパスにカスタマバーコードを出力する + /// + /// カスタマバーコード + /// 出力先 + /// 画像形式 + /// 拡大率(1で1シンボル12ピクセル) + public static void Save(this CustomerBarCode code, string outputPath, ImageFormat format, int scale = 1) + { + using (var img = code.ToBitmap(scale)) + { + img.Save(outputPath, format); + } + } + } +} diff --git a/ZipConvertCustomerBarCode.Drawing/ZipConvertCustomerBarCode.Drawing.csproj b/ZipConvertCustomerBarCode.Drawing/ZipConvertCustomerBarCode.Drawing.csproj new file mode 100644 index 0000000..7a9e4fb --- /dev/null +++ b/ZipConvertCustomerBarCode.Drawing/ZipConvertCustomerBarCode.Drawing.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + カスタマバーコードを System.Drawing の Bitmap として描画する(Windows のみ) + true + + + + + + + + + + + diff --git a/ZipConvertCustomerBarCode.SkiaSharp/CustomerBarCodeSkiaExtensions.cs b/ZipConvertCustomerBarCode.SkiaSharp/CustomerBarCodeSkiaExtensions.cs new file mode 100644 index 0000000..0dc7371 --- /dev/null +++ b/ZipConvertCustomerBarCode.SkiaSharp/CustomerBarCodeSkiaExtensions.cs @@ -0,0 +1,61 @@ +using System; +using System.IO; +using SkiaSharp; + +namespace ZipConvertCustomerBarCode.Skia +{ + /// + /// SkiaSharp によるカスタマバーコードの描画 + /// + public static class CustomerBarCodeSkiaExtensions + { + /// + /// カスタマバーコードのイメージを返す + /// + /// カスタマバーコード + /// 拡大率(1で1シンボル12ピクセル) + /// バーコードイメージ + public static SKBitmap ToSKBitmap(this CustomerBarCode code, int scale = 1) + { + if (code == null) throw new ArgumentNullException(nameof(code)); + + var img = new SKBitmap(code.GetWidth(scale), code.GetHeight(scale)); + using (var canvas = new SKCanvas(img)) + using (var paint = new SKPaint { Color = SKColors.Black, IsAntialias = false }) + { + canvas.Clear(SKColors.White); + foreach (var bar in code.GetBars(scale)) + { + canvas.DrawRect(SKRect.Create(bar.X, bar.Y, bar.Width, bar.Height), paint); + } + } + return img; + } + + /// + /// カスタマバーコードをPNG形式のバイト列で返す + /// + /// カスタマバーコード + /// 拡大率(1で1シンボル12ピクセル) + /// PNGデータ + public static byte[] ToPng(this CustomerBarCode code, int scale = 1) + { + using (var img = code.ToSKBitmap(scale)) + using (var data = img.Encode(SKEncodedImageFormat.Png, 100)) + { + return data.ToArray(); + } + } + + /// + /// 指定したパスにカスタマバーコードをPNG形式で出力する + /// + /// カスタマバーコード + /// 出力先 + /// 拡大率(1で1シンボル12ピクセル) + public static void SavePng(this CustomerBarCode code, string outputPath, int scale = 1) + { + File.WriteAllBytes(outputPath, code.ToPng(scale)); + } + } +} diff --git a/ZipConvertCustomerBarCode.SkiaSharp/ZipConvertCustomerBarCode.SkiaSharp.csproj b/ZipConvertCustomerBarCode.SkiaSharp/ZipConvertCustomerBarCode.SkiaSharp.csproj new file mode 100644 index 0000000..49cb198 --- /dev/null +++ b/ZipConvertCustomerBarCode.SkiaSharp/ZipConvertCustomerBarCode.SkiaSharp.csproj @@ -0,0 +1,18 @@ + + + + netstandard2.0 + ZipConvertCustomerBarCode.Skia + カスタマバーコードを SkiaSharp で描画する(クロスプラットフォーム) + true + + + + + + + + + + + diff --git a/ZipConvertCustomerBarCode.Tests/BarCodeTests.cs b/ZipConvertCustomerBarCode.Tests/BarCodeTests.cs new file mode 100644 index 0000000..8c456b8 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/BarCodeTests.cs @@ -0,0 +1,54 @@ +namespace ZipConvertCustomerBarCode.Tests +{ + public class BarCodeTests + { + [Theory] + [MemberData(nameof(TestCases.All), MemberType = typeof(TestCases))] + public void シンボル列が1x版と一致する(string zipCode, string address, string expected, string _) + { + var code = BarCode.Create(zipCode, address); + + Assert.Equal(expected.Split(' '), code.Symbols); + } + + [Theory] + [InlineData("0140113")] + [InlineData("014-0113")] + [InlineData("0140113")] + [InlineData("014‐0113")] + public void 郵便番号は全角とハイフンを受け付ける(string zipCode) + { + var code = BarCode.Create(zipCode, "添60-1"); + + Assert.Equal(new[] { "0", "1", "4", "0", "1", "1", "3" }, code.Symbols.Skip(1).Take(7)); + } + + [Theory] + [InlineData("")] + [InlineData("014011")] + [InlineData("01401130")] + [InlineData("014011A")] + [InlineData("014 0113")] + public void 郵便番号が7桁の数値でなければ例外(string zipCode) + { + Assert.Throws(() => BarCode.Create(zipCode, "添60-1")); + } + + [Fact] + public void 引数がnullなら例外() + { + Assert.Throws(() => BarCode.Create(null!, "添60-1")); + Assert.Throws(() => BarCode.Create("0140113", null!)); + } + + [Fact] + public void 常に23シンボルで開始コードと終了コードで挟まれる() + { + var code = BarCode.Create("0140113", ""); + + Assert.Equal(23, code.Symbols.Count); + Assert.Equal("STC", code.Symbols[0]); + Assert.Equal("SPC", code.Symbols[22]); + } + } +} diff --git a/ZipConvertCustomerBarCode.Tests/CustomerBarCodeTests.cs b/ZipConvertCustomerBarCode.Tests/CustomerBarCodeTests.cs new file mode 100644 index 0000000..adb1d68 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/CustomerBarCodeTests.cs @@ -0,0 +1,92 @@ +using System.Text.RegularExpressions; + +namespace ZipConvertCustomerBarCode.Tests +{ + public class CustomerBarCodeTests + { + private readonly CustomerBarCode code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); + + [Theory] + [InlineData(1, 276, 12)] + [InlineData(3, 828, 36)] + public void 画像サイズは拡大率に比例する(int scale, int width, int height) + { + Assert.Equal(width, code.GetWidth(scale)); + Assert.Equal(height, code.GetHeight(scale)); + } + + [Fact] + public void 拡大率が1未満なら例外() + { + Assert.Throws(() => code.GetWidth(0)); + Assert.Throws(() => code.GetHeight(0)); + Assert.Throws(() => code.GetBars(0)); + Assert.Throws(() => code.ToSvg(0)); + } + + [Fact] + public void バーは画像の範囲内に収まる() + { + foreach (var bar in code.GetBars()) + { + Assert.InRange(bar.X, 0, code.GetWidth() - bar.Width); + Assert.InRange(bar.Y, 0, code.GetHeight() - bar.Height); + } + } + + [Fact] + public void バー本数は開始終了コード各2本と他のシンボル各3本() + { + Assert.Equal(2 + 21 * 3 + 2, code.GetBars().Count()); + } + + [Fact] + public void 拡大するとバーの座標と大きさも拡大される() + { + var bars1 = code.GetBars(1).ToList(); + var bars2 = code.GetBars(2).ToList(); + + Assert.Equal(bars1.Count, bars2.Count); + for (int i = 0; i < bars1.Count; i++) + { + Assert.Equal(bars1[i].Type, bars2[i].Type); + Assert.Equal(bars1[i].X * 2, bars2[i].X); + Assert.Equal(bars1[i].Y * 2, bars2[i].Y); + Assert.Equal(bars1[i].Width * 2, bars2[i].Width); + Assert.Equal(bars1[i].Height * 2, bars2[i].Height); + } + } + + [Theory] + [InlineData(BarType.Long, 0, 12)] + [InlineData(BarType.Ascender, 0, 8)] + [InlineData(BarType.Descender, 4, 8)] + [InlineData(BarType.Timing, 4, 4)] + public void バー種別ごとの位置と高さ(BarType type, int y, int height) + { + var bars = code.GetBars().Where(x => x.Type == type).ToList(); + + Assert.NotEmpty(bars); + Assert.All(bars, bar => + { + Assert.Equal(y, bar.Y); + Assert.Equal(height, bar.Height); + Assert.Equal(2, bar.Width); + }); + } + + [Fact] + public void SVGにはサイズと全てのバーが含まれる() + { + var svg = code.ToSvg(2); + + Assert.StartsWith("", svg); + + var rects = Regex.Matches(svg, "") + .Select(m => (int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value), int.Parse(m.Groups[3].Value), int.Parse(m.Groups[4].Value))); + var bars = code.GetBars(2).Select(b => (b.X, b.Y, b.Width, b.Height)); + Assert.Equal(bars, rects); + } + } +} diff --git a/ZipConvertCustomerBarCode.Tests/DrawingRenderTests.cs b/ZipConvertCustomerBarCode.Tests/DrawingRenderTests.cs new file mode 100644 index 0000000..73d9444 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/DrawingRenderTests.cs @@ -0,0 +1,59 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.Versioning; +using ZipConvertCustomerBarCode.Drawing; + +namespace ZipConvertCustomerBarCode.Tests +{ + // System.Drawing は Windows のみ対応のため、それ以外ではスキップする + [SupportedOSPlatform("windows6.1")] + public class DrawingRenderTests + { + public DrawingRenderTests() + { + Assert.SkipUnless(OperatingSystem.IsWindows(), "System.Drawing は Windows のみ対応"); + } + + [Theory] + [MemberData(nameof(TestCases.All), MemberType = typeof(TestCases))] + public void 画像が1x版とピクセル単位で一致する(string zipCode, string address, string _, string imageFile) + { + using var expected = new Bitmap(TestCases.DataPath(imageFile)); + using var actual = BarCode.Create(zipCode, address).ToBitmap(); + + AssertSamePixels(expected, actual); + } + + [Fact] + public void GIFファイルに出力できる() + { + var code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); + var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".gif"); + try + { + code.Save(path, ImageFormat.Gif, 2); + + using var saved = new Bitmap(path); + using var expected = code.ToBitmap(2); + AssertSamePixels(expected, saved); + } + finally + { + File.Delete(path); + } + } + + private static void AssertSamePixels(Bitmap expected, Bitmap actual) + { + Assert.Equal(expected.Width, actual.Width); + Assert.Equal(expected.Height, actual.Height); + for (int y = 0; y < expected.Height; y++) + { + for (int x = 0; x < expected.Width; x++) + { + Assert.True(expected.GetPixel(x, y).ToArgb() == actual.GetPixel(x, y).ToArgb(), $"({x}, {y}) が一致しない"); + } + } + } + } +} diff --git a/ZipConvertCustomerBarCode.Tests/SkiaRenderTests.cs b/ZipConvertCustomerBarCode.Tests/SkiaRenderTests.cs new file mode 100644 index 0000000..4c53770 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/SkiaRenderTests.cs @@ -0,0 +1,60 @@ +using SkiaSharp; +using ZipConvertCustomerBarCode.Skia; + +namespace ZipConvertCustomerBarCode.Tests +{ + public class SkiaRenderTests + { + [Theory] + [MemberData(nameof(TestCases.All), MemberType = typeof(TestCases))] + public void 画像が1x版とピクセル単位で一致する(string zipCode, string address, string _, string imageFile) + { + using var expected = SKBitmap.Decode(TestCases.DataPath(imageFile)); + using var actual = BarCode.Create(zipCode, address).ToSKBitmap(); + + AssertSamePixels(expected, actual); + } + + [Fact] + public void PNGをデコードすると描画結果と一致する() + { + var code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); + using var bitmap = code.ToSKBitmap(); + using var png = SKBitmap.Decode(code.ToPng()); + + AssertSamePixels(bitmap, png); + } + + [Fact] + public void PNGファイルに出力できる() + { + var code = BarCode.Create("0140113", "秋田県大仙市堀見内 南田茂木 添60-1"); + var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".png"); + try + { + code.SavePng(path, 2); + + using var saved = SKBitmap.Decode(path); + using var expected = code.ToSKBitmap(2); + AssertSamePixels(expected, saved); + } + finally + { + File.Delete(path); + } + } + + private static void AssertSamePixels(SKBitmap expected, SKBitmap actual) + { + Assert.Equal(expected.Width, actual.Width); + Assert.Equal(expected.Height, actual.Height); + for (int y = 0; y < expected.Height; y++) + { + for (int x = 0; x < expected.Width; x++) + { + Assert.True(expected.GetPixel(x, y) == actual.GetPixel(x, y), $"({x}, {y}) が一致しない"); + } + } + } + } +} diff --git a/ZipConvertCustomerBarCode.Tests/TestCases.cs b/ZipConvertCustomerBarCode.Tests/TestCases.cs new file mode 100644 index 0000000..0eb86e4 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/TestCases.cs @@ -0,0 +1,26 @@ +namespace ZipConvertCustomerBarCode.Tests +{ + /// + /// TestData/cases.tsv のテストケース + /// 期待値(シンボル列・画像)は 1.x (.NET Framework 版)の出力 + /// + public static class TestCases + { + public static string DataPath(string fileName) => + Path.Combine(AppContext.BaseDirectory, "TestData", fileName); + + /// + /// 郵便番号, 住所, 期待するシンボル列(空白区切り), 期待する画像ファイル名 + /// + public static TheoryData All() + { + var data = new TheoryData(); + foreach (var line in File.ReadAllLines(DataPath("cases.tsv"))) + { + var p = line.Split('\t'); + data.Add(p[0], p[1], p[2], p[3]); + } + return data; + } + } +} diff --git a/ZipConvertCustomerBarCode.Tests/TestData/cases.tsv b/ZipConvertCustomerBarCode.Tests/TestData/cases.tsv new file mode 100644 index 0000000..918ab88 --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/TestData/cases.tsv @@ -0,0 +1,20 @@ +0140113 秋田県大仙市堀見内 南田茂木 添60-1 STC 0 1 4 0 1 1 3 6 0 - 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC8 SPC v1-0.png +2630023 千葉市稲毛区緑町3丁目30-8 郵便ビル403号 STC 2 6 3 0 0 2 3 3 - 3 0 - 8 - 4 0 3 CC4 CC4 CC4 5 SPC v1-1.png +0140113 秋田県大仙市堀見内南田茂木添60-1 STC 0 1 4 0 1 1 3 6 0 - 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC8 SPC v1-2.png +1100016 東京都台東区台東5-6-3 ABCビル10F STC 1 1 0 0 0 1 6 5 - 6 - 3 - 1 0 CC1 5 CC4 CC4 CC4 2 SPC v1-3.png +0600906 北海道札幌市東区北六条東4丁目 郵便センター6号館 STC 0 6 0 0 9 0 6 4 - 6 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 9 SPC v1-4.png +0650006 北海道札幌市東区北六条東8丁目 郵便センター10号館 STC 0 6 5 0 0 0 6 8 - 1 0 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 9 SPC v1-5.png +4070033 山梨県韮崎市龍岡町下條南割 韮崎400 STC 4 0 7 0 0 3 3 4 0 0 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 - SPC v1-6.png +2730102 千葉県鎌ケ谷市右京塚 東3丁目-20-5 郵便・A&bコーポB604号 STC 2 7 3 0 1 0 2 3 - 2 0 - 5 CC1 1 6 0 4 CC4 CC4 0 SPC v1-7.png +1980036 東京都青梅市河辺町十一丁目六番地一号 郵便タワー601 STC 1 9 8 0 0 3 6 6 0 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC6 SPC v1-8.png +0270203 岩手県宮古市大字津軽石第二地割原 郵便番号CD-1 STC 0 2 7 0 2 0 3 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 7 SPC v1-9.png +5900016 大阪府堺市堺区中田出井町四丁 AB 101-1 STC 5 9 0 0 0 1 6 1 0 1 - 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 6 SPC v1-10.png +0800831 北海道帯広市稲田町南七線 西28 STC 0 8 0 0 8 3 1 2 8 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 6 SPC v1-11.png +3170055 茨城県日立市宮田町6丁目7-14 ABC建設A棟 STC 3 1 7 0 0 5 5 6 - 7 - 1 4 CC1 0 CC4 CC4 CC4 CC4 CC4 CC2 SPC v1-12.png +6500046 神戸市中央区港島中町9丁目7-6 郵便シティ A-1101 STC 6 5 0 0 0 4 6 9 - 7 - 6 CC1 0 1 1 0 1 CC4 CC4 9 SPC v1-13.png +6230011 京都府綾部市青野町綾部6-7 LプラザB106 STC 6 2 3 0 0 1 1 6 - 7 CC2 1 CC1 1 1 0 6 CC4 CC4 CC4 4 SPC v1-14.png +0640804 札幌市中央区南四条西29丁目1524-23 第2郵便ハウス501 STC 0 6 4 0 8 0 4 2 9 - 1 5 2 4 - 2 3 - 2 - 3 SPC v1-15.png +123-4567 とある県とある市とある町 1丁目1の1 STC 1 2 3 4 5 6 7 1 - 1 - 1 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 8 SPC v1-17.png +1234567 abc123-45 STC 1 2 3 4 5 6 7 1 2 3 - 4 5 CC4 CC4 CC4 CC4 CC4 CC4 CC4 1 SPC v1-18.png +1234567 1-2-3-4-5-6-7-8-9-10-11-12 STC 1 2 3 4 5 6 7 1 - 2 - 3 - 4 - 5 - 6 - 7 CC7 SPC v1-19.png +1234567 STC 1 2 3 4 5 6 7 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC4 CC8 SPC v1-21.png diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-0.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-0.png new file mode 100644 index 0000000000000000000000000000000000000000..47162fcadcb0ad272c3e6d09fd482e8bf181c424 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBp5hiOG)?RNJ*b>_|GV3(M{(l2^;ULQ$G)jLv{&!j6Wy2h)@|SNeYbt_?)=y! zdH$CQC57v|W2av^x>v8v_F$`0$y?1SYt^4-xyYqM6MNhwR+}VmF_Rj01>#C(7v;2Xo=j~Cwd;9COZ*||(^S-b3 ze)CxIPeN^N?cd%&n~3=M`1)eWqs?D|zDB=tM5FM-{-Tdyqk*1GLWs&~)3@ptC>@86<<#&`go=6(BX3(%{(Zj@&3zBlRJ z+p47R>HF^8&X0Bbs89*?f9`eRccmMFE?xSz3gm~*yYqim3$$q>*ndy$Pv>PzQ O89ZJ6T-G@yGywqrz1wF1 literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-1.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..51090f183c762030d0a1a1bd60cb56849ec55b27 GIT binary patch literal 472 zcmV;}0Vn>6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0c}Y{K~!i%?ao1} z6-czdtQc3&Rq;BeQ) zUS6EuPrEL5U8;-w@+o!ycGsnP;k{nGz1L;CFAsHaxa(psFHY~LT^GA9)x~}Jl)8Vr z>r%b&UN7F>>$2UKhxmc(*RNlHVksV6zkdDtlgm;(xPJZm^(U95cyRst_3KYAOYvap zGVSG3U3T}n*mbe%MeXgnR4=CY?sYlc^}@Yge7&Fca#@N8Q+*Tt@jT`y{H z*QI(fy?3w6>8=;<_2TROw3o|LJeaynd%0AX-Mub$UF>>Md%G^xi|M_4T~2qsaIY6% z@29<7mg2$GW!lT7y6oji`v_Dsa{O)-Rp9?>xFy0_V{#GfMo O00000 literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-10.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-10.png new file mode 100644 index 0000000000000000000000000000000000000000..62513d87b0cc6c637aac28a4198f9cf68ffa9f39 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBFMGalHvTe*RhMmkmty+|MTy)TAn(x zNa0CHlbwdv<@@qK_Pzf;cgNkcz1ORE9jtwI#OmR^yc_f8&YN_ve1CFvnbk!*xi=4r z%+2H8zhwKqQuuXC^{&L~vMR5t`+xi1-hAouyJAE0>AQC-_AZycv)pfu@Vl37Kw-_7 zwco9`r7stL`}iQAUU~83uk-Q>=38y_+p%04D7<{h_q*?bw)k!7XaDKAH*WoWiB|Tn zReS4-jJWt;eXaWYBt=B-%ImMcPM*}TF;LG0Td(r=8O(KgCHsr3=a&@&RiE*^1#-KU z=Wa`w>C$)K-?_K^?wp=O%*B(+Kz93G%7Z)2?Ys5%@0sT6i$5Hgvjpt$$y;W_{I%=i h-*azkZ=F49f44R0()91v1;CJH@O1TaS?83{1ORe3&gB3A literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-11.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-11.png new file mode 100644 index 0000000000000000000000000000000000000000..9130cad35129c48da89925ad0f1226d474a04874 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBFMGalHvUJtYcTJg8)n5`}&uXKTe0= z@NAM^$`s?`E*4i`5PSXoZsk(X>fQ4ys_uWgw)E|;C3?H07qH?p*#oH$V2)I`3DTejCT%zg^l{YqO;J zg6iA1RgYfQ-j1HW?e(NxZ~mRR{=F z|E5Z7+2y*(Ld c7TH?ul~tM+Sx5@}1BN7nr>mdKI;Vst07AsaZvX%Q literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-12.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-12.png new file mode 100644 index 0000000000000000000000000000000000000000..b381ab00e7387d8a91ffc6a2c990570d0e6a9c65 GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdB%3nTRpnn_`gYfrSpOw^W5svR^Z0!w`quY- z`}%8ZIM^TUE8X~d(ylr8ZkJ~6*2}#voSA?9=sNXFc3-D`+q?dKvb_AE#vS>wZ+0!w zTmHQ)_SQP@+h1L7-3Dsv+~U7?Y3=*hzi%9GFHm?FExucC<>{AuW2bL>eW}cL;MgFgurP(=nhptpw{f?AZ+{ys{(aXUCgw0@rma_7dx4R`;OXk;vd$@?2>?hv_UQls literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-13.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-13.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6a3579cafe3153f6fd7ab199cc1daf57b58422 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdB*->oMzX`9|*S-Gr`(O9(qK&VQ-mczTu)aHXdgk@+yLk6qev8uw$)(=b?7_dHMIP+odP>*&J!y zp)bBWZqMH9+#tD`WqWVjeZA@S(Y<fd?2>Gs#yKl=Jv`PYxG^Zt6Me(#T} z__!-|nqL*(olf08U3__U?3=2GantXvd;h4uGO&8LURmra@qe$6UjO}R(Kqjv?1k}q zyZ7#~xcfTkI`{WoZ^~-L|DW!@b-Q%q>!7_K;`R64n=ZaJ-pjV*chSwaPmjKg6W<-T z<9h1$*SmiJ?YXzEJ9hf3*8f!>zwXMO2uIK$Rv8JZx&$(1h zyPp33{`)(1jD~Q$impH`dd$5{>{^$zVt_c-nSx< zkl*)RH%cpacmMu$Xs_PYqkBQ__kQcY+h*_mw@){T$e%hI2NF6Ba+zL!d0{-zc}sWg z00l?s%D&@7-yjZ$rdEhOgAyYXA1rm%8oKPwTIB Xp4|L%?;c=uFfe$!`njxgN@xNAe=z`K literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-15.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-15.png new file mode 100644 index 0000000000000000000000000000000000000000..8efc39c2726e51e77b7872ef01cb1dcd5d2c90db GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdB;U6N_XBZomm#UELOa_GVu59*y-zc z@3^k|`(pt6Meg^@^{y`cR<^fb{pq*sPH%Z_^mf;c)7`i3zuQ%F_vl`|oBi!p9dQ-* zr7QKeZhzfc9h+AUG-rC|^`midSN@en=6iA4*g!~UAl5_tp1(XMY}=f z`0UpE_G!_#?Ys5j%L~_ge|xN0w_)GDegBRG+C;?1$JZBGcCo((0)IXCj|sK4wSP}O z)sUMa4zwrf`tpkSxGVSK;&xn5y;VB%TT$h1pkVi{+g}%bD~o-zOXg@Z&}1O%m&kjd zYj2FVdQ&MBb@0HM$P(*OVf literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-17.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-17.png new file mode 100644 index 0000000000000000000000000000000000000000..6712044bf3be3c7d7aeb4450f5e09d5a43fca2ac GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBOFYoQT@zv$lZ7`npt?pa(o!6gs>g!)R_*S0hzBkB>r0c?&`CuG<>-Wv~h3ij0 z-?ztueS5t@jsDI#@78w5`Y+iF#`&4=)At|Wt2h7mC#63JegJ{A_s4{qnwmdnQ#Iv! z`uqF$@6cC)T@O1TaS?83{1OSQM<1GLH literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-18.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-18.png new file mode 100644 index 0000000000000000000000000000000000000000..4208f986d2629549563b0bf1eb8d0d1e279b41e6 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBgnPblHvUJoMYEf1A!wK?)<-G{Gq(^ zSSD9>B$Iy2s)Og{ZO(tLwtlng&byVT-_F~0qjcxpQqSFb%VT%_Klb;D@Z~zq$BsW1 z-nIpb2aE64+rC>b^ZL^*-rw)9D^JV(V?j3TS`s_`vfkbL$911NGxv+|zxrBL`+O5_ItXZCS?r~C z-LccREC;gQ{5rD5AMCdJo-{an^LB{Ts5y>!(% literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-19.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-19.png new file mode 100644 index 0000000000000000000000000000000000000000..10663851c65c9c3ff9465bba355b7a50209c03c2 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdB!MxT^_Ew^PP#6fS--oxI`-B&^-KTC#J}&_5}WV& zePe%nNkH9!m-lwfdAGJZ)_=+0w|ehNGk4GP_&Q62*|85 z+lk+{@7{5J>Dwx$xB2CT>%DJ(omL|MyTXJ0DLc@R(?GLse08~X|J|dw>Dyj+ZrOkL z=w7|t>(Q5L-#k|QbMPw=n7e&UsI9I2dp1>s|JwEI*YC$52}FtS)++-#vpaVBw(avg ts)23+;oooX10BTq{UlHieUvp5hiOG)?RNJ*b>_|GV3(M{(l2^;ULQ$G)jLv{&!j6Wy2h)@|SNeYbt_?)=y! zdH$CQC57v|W2av^x>v8v_F$`0$y?1SYt^4-xyYqM6MNhwR+}VmF_Rj01>#C(7v;2Xo=j~Cwd;9COZ*||(^S-b3 ze)CxIPeN^N?cd%&n~3=M`1)eWqs?D|zDB=tM5FM-{-Tdyqk*1GLWs&~)3@ptC>@86<<#&`go=6(BX3(%{(Zj@&3zBlRJ z+p47R>HF^8&X0Bbs89*?f9`eRccmMFE?xSz3gm~*yYqim3$$q>*ndy$Pv>PzQ O89ZJ6T-G@yGywqrz1wF1 literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-21.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-21.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c9636667a73f39f6b5045371aefd30c3c002e6 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBFMGalHvUJoMYD!0|6Gt|Nk%VHZX7B zFze8+okGthoXR?OT|Vae*Wb2@*PoX7$NGK05`5|RyYDr%^LO>sR?gt_t9Q5&JpHom z*C}82{kDz2zg#alUT#_QWqE;bSAZI9RrkKHJAeKA%F{Qdx4(Swg}ueL)behyzvuhi z_dkEFeP#6RY2uIOs=aabNt$w3UVr^H`E-!YitDexs!v~95wQOHYkxiOj|!z5UngBx zeY@*MspoFJ;OXzam((BscP&*@Zi!x5?3-OnV#RmsWnNExb?NWCckgf9-=%Z3`O49C z-LccRK=k>s3_ MboFyt=akR{0B10?e*gdg literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-3.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd7f29edd0e58ab76e07a6abaff4ab702692a00 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdBFuL?^;ULQ$F7Q%Di&+h210+_-BAP>1b9yPYMwcU)I31=_gv z^`t7LyXCum-j`;6f9zgy;1>``yMIimt*!lg_Nj*4n)U0~@82nNwD~I#m``6^5m37E z^`u=u^()I__g(wya_ctGNqO&g1Myp+e=NJ$L&bN4T@3Wf)9hIPC3}GmdHQYN?Wf=F ft?Q1Zh7t848$K&v3yPfti~x8L_%D_$;q_jt4HiM$W@ z?s!xms{Sl;Z+YIFZzYTW&bwaqu4K{giVe&+dGF1Z&h)RypLgi@mEOzq^0wUn9Cd!K zUx_?_nZoXa)y2whIp3cRu9&~8@YdztZ`E#6VEy&i+Q$wxSM809x0K}O zfAzJh_GyZa&5G-t#+`|_<+~<+Yxxe= k{p8!+E%%G7=Ue?`50cqbB)W?`3K)b8p00i_>zopr03}Mo;s5{u literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-5.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-5.png new file mode 100644 index 0000000000000000000000000000000000000000..750b16f7ca02b349c5ecd60da8eab41441ea98e0 GIT binary patch literal 419 zcmV;U0bKrxP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0XRuSK~!i%?TtZ- z#4r%V^8Zio!W`AuqQFirC76SvYR~frp6B`fR#-Q9Z%)|h#_c`fy*WAE>BM?U`d;^Y zPVd?2MEm$)2ht7Rn-g}raeGgAZ%$5kIPOPV-?{&ZD^q!qgw2u#VAl=}-Ibo+8xA%ni=Hzsz6YDAId)@Cjy=SKr?c;;| zLA_qDuNZ{~^?JR&axw}J>h*ek4^FgI+^PABYiEh_jey&=l$wY-1I9;?{i`t|GY@9cSW z@D~uwJ&i>`MSS&_y1oq{xE%g zhRcOxtA(C8X?*(3Z#Vz^ecO%SJ{_v9d>A+VRnYIPuRpzAxBkli^}FMC=9*e>CoPNoBr*-9{%dT#!myP8D$r< zzwYm^$)^Krb^z(G>eCnhC;-y0{q@{GJ_OR&=g0ItI{d2j_tmAlc3cPHqwB=CZhsxL zcg6p$uUo5QuK~IBx0imqdUP*POXAlJ5<7?NqZ+C_0zp8&*1q`6AK<@prm9?dX>wyl7*juoF zSBUs`Fuw71(YLbLRpMXwm+dWBfBF`Xo4@c@NS|@%vZqN0jvEtu99g3T8wD+4b7DL4P+sIe3~sD_-wimEqf?)vUHGStY5$W{!W>0_SZmAu6O*=!Cycy_w>e!4g2=(t9xFgBj>Ys1IXlx+pmr80xjXL z-h1QU%=O%Re+dhgpVAD{=m9*Wc7R{!kv-immTQCGNumY(k3zE|&Ztav%l zm~NoORr>d)1C2KTss(!JQSSQFB|yIc-Ieq^ec!$A?@vF;UlnXx^nGqaAuxa$JYD@< J);T3K0RZH!+Ohxu literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-9.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0c6171753dcf0bd16a3bcdb7e8a355d3c9f90d GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0y~yU=#tec{tdB*?YclHvUJv}4y12cDxB?)<-GeBpHX zl9ufUne>lLpKo6=?|FIt6}_vwr+dE*+PmBC=>L`eGymn+KhLhM4E($CiSwJFz12HG z3SI~Qng46b%m3fX_g$MVepTMv?g%;By7^xNLB8JcM~8m_!R*r;e{9&dZ{NRXMLKqC z)~{c`f2T}0|I^mJaW|%mf7^9M@7t~&uaAB!-?l&5zSL4o{uFoh-VOTtZ%S9jz9}ud z-u?D{PW|z^S3u2E#J^P~#>d@w9klz#>qqOvZ{NT9ukY`brx7(8`ft7-+P7!J^`&JS nuOE%o-?o4AU)kR)Puov@vZ?6!c7`Ni=rMS@`njxgN@xNAuRX}V literal 0 HcmV?d00001 diff --git a/ZipConvertCustomerBarCode.Tests/ZipConvertCustomerBarCode.Tests.csproj b/ZipConvertCustomerBarCode.Tests/ZipConvertCustomerBarCode.Tests.csproj new file mode 100644 index 0000000..ab89d7e --- /dev/null +++ b/ZipConvertCustomerBarCode.Tests/ZipConvertCustomerBarCode.Tests.csproj @@ -0,0 +1,26 @@ + + + + net10.0 + Exe + enable + enable + false + + + + + + + + + + + + + + + + + + diff --git a/ZipConvertCustomerBarCode.sln b/ZipConvertCustomerBarCode.sln index 17a0fbd..ff7bca3 100644 --- a/ZipConvertCustomerBarCode.sln +++ b/ZipConvertCustomerBarCode.sln @@ -1,42 +1,74 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibExecuter", "LibExecuter\LibExecuter.csproj", "{73611104-9843-44A5-835D-F9BBA7D9001C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipConvertCustomerBarCode", "ZipConvertCustomerBarCode\ZipConvertCustomerBarCode.csproj", "{42BAA207-3CF3-4735-8C44-64E7CC5C7424}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipConvertCustomerBarCode", "ZipConvertCustomerBarCode\ZipConvertCustomerBarCode.csproj", "{AF6583CF-653D-42F8-A286-526D9A8EBF03}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipConvertCustomerBarCode.Drawing", "ZipConvertCustomerBarCode.Drawing\ZipConvertCustomerBarCode.Drawing.csproj", "{C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipConvertCustomerBarCode.SkiaSharp", "ZipConvertCustomerBarCode.SkiaSharp\ZipConvertCustomerBarCode.SkiaSharp.csproj", "{973767EE-1C14-4CF1-8BD7-21F45C853E39}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZipConvertCustomerBarCode.Tests", "ZipConvertCustomerBarCode.Tests\ZipConvertCustomerBarCode.Tests.csproj", "{961F7ADE-F107-48C5-816D-865351AAAB92}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {73611104-9843-44A5-835D-F9BBA7D9001C}.Debug|Any CPU.ActiveCfg = Debug|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Debug|x86.ActiveCfg = Debug|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Debug|x86.Build.0 = Debug|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Release|Any CPU.ActiveCfg = Release|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Release|Mixed Platforms.Build.0 = Release|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Release|x86.ActiveCfg = Release|x86 - {73611104-9843-44A5-835D-F9BBA7D9001C}.Release|x86.Build.0 = Release|x86 - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Debug|x86.ActiveCfg = Debug|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Release|Any CPU.Build.0 = Release|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AF6583CF-653D-42F8-A286-526D9A8EBF03}.Release|x86.ActiveCfg = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|x64.ActiveCfg = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|x64.Build.0 = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|x86.ActiveCfg = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Debug|x86.Build.0 = Debug|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|Any CPU.Build.0 = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|x64.ActiveCfg = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|x64.Build.0 = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|x86.ActiveCfg = Release|Any CPU + {42BAA207-3CF3-4735-8C44-64E7CC5C7424}.Release|x86.Build.0 = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|x64.ActiveCfg = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|x64.Build.0 = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|x86.ActiveCfg = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Debug|x86.Build.0 = Debug|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|Any CPU.Build.0 = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|x64.ActiveCfg = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|x64.Build.0 = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|x86.ActiveCfg = Release|Any CPU + {C8262B42-77B2-4F58-9C41-9A21AAB7C3B9}.Release|x86.Build.0 = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|x64.ActiveCfg = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|x64.Build.0 = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|x86.ActiveCfg = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Debug|x86.Build.0 = Debug|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|Any CPU.Build.0 = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|x64.ActiveCfg = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|x64.Build.0 = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|x86.ActiveCfg = Release|Any CPU + {973767EE-1C14-4CF1-8BD7-21F45C853E39}.Release|x86.Build.0 = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|x64.ActiveCfg = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|x64.Build.0 = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|x86.ActiveCfg = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Debug|x86.Build.0 = Debug|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|Any CPU.Build.0 = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|x64.ActiveCfg = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|x64.Build.0 = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|x86.ActiveCfg = Release|Any CPU + {961F7ADE-F107-48C5-816D-865351AAAB92}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ZipConvertCustomerBarCode/Bar.cs b/ZipConvertCustomerBarCode/Bar.cs new file mode 100644 index 0000000..f5eb9e3 --- /dev/null +++ b/ZipConvertCustomerBarCode/Bar.cs @@ -0,0 +1,58 @@ +namespace ZipConvertCustomerBarCode +{ + /// + /// バーの種類 + /// + public enum BarType + { + /// ロングバー(上段~下段) + Long, + + /// セミロングバー(上段~中段) + Ascender, + + /// セミロングバー(中段~下段) + Descender, + + /// タイミングバー(中段のみ) + Timing + } + + /// + /// バー1本の配置(ピクセル単位) + /// + public readonly struct Bar + { + /// + /// バーを生成する + /// + /// バーの種類 + /// X座標 + /// Y座標 + /// 幅 + /// 高さ + public Bar(BarType type, int x, int y, int width, int height) + { + Type = type; + X = x; + Y = y; + Width = width; + Height = height; + } + + /// バーの種類 + public BarType Type { get; } + + /// X座標 + public int X { get; } + + /// Y座標 + public int Y { get; } + + /// 幅 + public int Width { get; } + + /// 高さ + public int Height { get; } + } +} diff --git a/ZipConvertCustomerBarCode/BarCode.cs b/ZipConvertCustomerBarCode/BarCode.cs index 8a1473e..226db0c 100644 --- a/ZipConvertCustomerBarCode/BarCode.cs +++ b/ZipConvertCustomerBarCode/BarCode.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; using System.Linq; using System.Text.RegularExpressions; -using ZipConvertCustomerBarCode.Properties; namespace ZipConvertCustomerBarCode { + /// + /// カスタマバーコード生成 + /// public static class BarCode { // 開始コード @@ -59,44 +59,23 @@ public static class BarCode {"-",10},{"CC1",11},{"CC2",12},{"CC3",13},{"CC4",14},{"CC5",15},{"CC6",16},{"CC7",17},{"CC8",18} }; - // 画像リソースキー辞書 - private static readonly Dictionary ImageKeyDic = new Dictionary() - { - {"0","Num0"},{"1","Num1"},{"2","Num2"},{"3","Num3"},{"4","Num4"},{"5","Num5"}, - {"6","Num6"},{"7","Num7"},{"8","Num8"},{"9","Num9"},{"-","Hyphen"},{"CC1","CC1"}, - {"CC2","CC2"},{"CC3","CC3"},{"CC4","CC4"},{"CC5","CC5"},{"CC6","CC6"},{"CC7","CC7"}, - {"CC8","CC8"},{"STC","Start"},{"SPC","End"} - }; - // アルファベット private static readonly string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /// - /// 指定したパスにカスタマバーコードを出力する。 + /// カスタマバーコードを生成する /// - /// 郵便番号(ハイフンなし半角数字7桁) + /// 郵便番号(半角・全角数字7桁、ハイフンは可) /// 住所 - /// 出力先 - public static void Export(string zipCode, string address, string outputPath) + /// カスタマバーコード + /// 郵便番号が7桁の数値でない場合 + public static CustomerBarCode Create(string zipCode, string address) { - var code = ConvertCustomerBarCode(address, CheckPostCode(zipCode)); - using (var img = CreateImage(code)) - { - img.Save(outputPath, ImageFormat.Gif); - } - } + if (zipCode == null) throw new ArgumentNullException(nameof(zipCode)); + if (address == null) throw new ArgumentNullException(nameof(address)); - /// - /// カスタマバーコードのイメージを返す - /// - /// 郵便番号(ハイフンなし半角数字7桁) - /// 住所 - /// バーコードイメージ - public static Bitmap CreateImage(string zipCode, string address) - { var code = ConvertCustomerBarCode(address, CheckPostCode(zipCode)); - var img = CreateImage(code); - return img; + return new CustomerBarCode(code.ToArray()); } /// @@ -122,25 +101,6 @@ private static IEnumerable CheckPostCode(string zipCode) } - /// - /// イメージ生成 - /// - /// カスタマバーコード - /// バーコードイメージ - private static Bitmap CreateImage(IEnumerable code) - { - var img = new Bitmap(276, 12); - var rmgr = Resources.ResourceManager; - using (var gr = Graphics.FromImage(img)) - { - foreach (var c in code.Select((x, i) => new { Value = x, Index = i })) - { - gr.DrawImage((Image)rmgr.GetObject(ImageKeyDic[c.Value]), c.Index * 12, 0); - } - } - return img; - } - /// /// カスタマバーコード変換 /// @@ -202,7 +162,7 @@ private static string TrimHyphen(string target) } target = (new string(tmp)).Replace("@", ""); - // 6. 最後に、先頭がハイフンの場合は取り除きます。 + // 6. 最後に、先頭がハイフンの場合は取り除きます。 return target.Trim('-'); } diff --git a/ZipConvertCustomerBarCode/CustomerBarCode.cs b/ZipConvertCustomerBarCode/CustomerBarCode.cs new file mode 100644 index 0000000..c1c0bef --- /dev/null +++ b/ZipConvertCustomerBarCode/CustomerBarCode.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace ZipConvertCustomerBarCode +{ + /// + /// 生成済みのカスタマバーコード + /// 描画ライブラリに依存しないバーの配置情報を持つ + /// + public sealed class CustomerBarCode + { + // 1シンボルの幅・高さ(scale=1のときのピクセル数) + private const int CellWidth = 12; + private const int CellHeight = 12; + + // バーの幅、バーの間隔 + private const int BarWidth = 2; + private const int BarPitch = 4; + + // シンボル→バー配置辞書 + // L:ロングバー、A:セミロングバー(上)、D:セミロングバー(下)、T:タイミングバー、空白:バーなし + private static readonly Dictionary BarPatternDic = new Dictionary() + { + {"0","LTT"},{"1","LLT"},{"2","LDA"},{"3","DLA"},{"4","LAD"}, + {"5","LTL"},{"6","DAL"},{"7","ALD"},{"8","ADL"},{"9","TLL"}, + {"-","TLT"},{"CC1","DAT"},{"CC2","DTA"},{"CC3","ADT"},{"CC4","TDA"}, + {"CC5","ATD"},{"CC6","TAD"},{"CC7","TTL"},{"CC8","LLL"}, + {"STC"," LD"},{"SPC","DL "} + }; + + internal CustomerBarCode(IReadOnlyList symbols) + { + Symbols = symbols; + } + + /// + /// シンボル列 + /// 開始コード("STC")、郵便番号、住所表示番号、チェックデジット、終了コード("SPC")の順 + /// 住所表示番号の制御コードは"CC1"~"CC8" + /// + public IReadOnlyList Symbols { get; } + + /// + /// 画像の幅 + /// + /// 拡大率(1で1シンボル12ピクセル) + public int GetWidth(int scale = 1) + { + CheckScale(scale); + return Symbols.Count * CellWidth * scale; + } + + /// + /// 画像の高さ + /// + /// 拡大率(1で12ピクセル) + public int GetHeight(int scale = 1) + { + CheckScale(scale); + return CellHeight * scale; + } + + /// + /// バーの配置を返す + /// 背景は白、バーは黒で描画する想定 + /// + /// 拡大率(1で1シンボル12ピクセル) + /// バー配置 + public IEnumerable GetBars(int scale = 1) + { + CheckScale(scale); + return Symbols.SelectMany((symbol, i) => + BarPatternDic[symbol].Select((type, j) => new { Type = type, X = i * CellWidth + j * BarPitch })) + .Where(x => x.Type != ' ') + .Select(x => CreateBar(x.Type, x.X, scale)); + } + + /// + /// SVG形式の文字列を返す + /// + /// 拡大率(1で1シンボル12ピクセル) + /// SVG + public string ToSvg(int scale = 1) + { + var sb = new StringBuilder(); + sb.AppendFormat(CultureInfo.InvariantCulture, + "", + GetWidth(scale), GetHeight(scale)); + sb.Append(""); + foreach (var bar in GetBars(scale)) + { + sb.AppendFormat(CultureInfo.InvariantCulture, + "", + bar.X, bar.Y, bar.Width, bar.Height); + } + sb.Append(""); + return sb.ToString(); + } + + /// + /// バー生成 + /// + /// バー種別文字 + /// X座標(scale=1) + /// 拡大率 + /// バー + private static Bar CreateBar(char type, int x, int scale) + { + // 上段・中段・下段を各4ピクセルとして、バー種別ごとの範囲を決める + switch (type) + { + case 'L': return new Bar(BarType.Long, x * scale, 0, BarWidth * scale, 12 * scale); + case 'A': return new Bar(BarType.Ascender, x * scale, 0, BarWidth * scale, 8 * scale); + case 'D': return new Bar(BarType.Descender, x * scale, 4 * scale, BarWidth * scale, 8 * scale); + case 'T': return new Bar(BarType.Timing, x * scale, 4 * scale, BarWidth * scale, 4 * scale); + default: throw new InvalidOperationException(); + } + } + + /// + /// 拡大率チェック + /// + /// 拡大率 + private static void CheckScale(int scale) + { + if (scale < 1) throw new ArgumentOutOfRangeException(nameof(scale), "拡大率は1以上で指定してください。"); + } + } +} diff --git a/ZipConvertCustomerBarCode/Properties/AssemblyInfo.cs b/ZipConvertCustomerBarCode/Properties/AssemblyInfo.cs deleted file mode 100644 index 37591b9..0000000 --- a/ZipConvertCustomerBarCode/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 -// アセンブリに関連付けられている情報を変更するには、 -// これらの属性値を変更してください。 -[assembly: AssemblyTitle("ZipConvertCustomerBarCode")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Toshiba")] -[assembly: AssemblyProduct("ZipConvertCustomerBarCode")] -[assembly: AssemblyCopyright("Copyright © Toshiba 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから -// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 -// その型の ComVisible 属性を true に設定してください。 -[assembly: ComVisible(false)] - -// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です -[assembly: Guid("9ac692db-bcdd-40da-a3d0-c93a5aa1ba31")] - -// アセンブリのバージョン情報は、以下の 4 つの値で構成されています: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を -// 既定値にすることができます: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ZipConvertCustomerBarCode/Properties/Resources.Designer.cs b/ZipConvertCustomerBarCode/Properties/Resources.Designer.cs deleted file mode 100644 index 4175fac..0000000 --- a/ZipConvertCustomerBarCode/Properties/Resources.Designer.cs +++ /dev/null @@ -1,273 +0,0 @@ -//------------------------------------------------------------------------------ -// -// このコードはツールによって生成されました。 -// ランタイム バージョン:4.0.30319.34209 -// -// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、 -// コードが再生成されるときに損失したりします。 -// -//------------------------------------------------------------------------------ - -namespace ZipConvertCustomerBarCode.Properties { - using System; - - - /// - /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。 - /// - // このクラスは StronglyTypedResourceBuilder クラスが ResGen - // または Visual Studio のようなツールを使用して自動生成されました。 - // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に - // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ZipConvertCustomerBarCode.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、 - /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC1 { - get { - object obj = ResourceManager.GetObject("CC1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC2 { - get { - object obj = ResourceManager.GetObject("CC2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC3 { - get { - object obj = ResourceManager.GetObject("CC3", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC4 { - get { - object obj = ResourceManager.GetObject("CC4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC5 { - get { - object obj = ResourceManager.GetObject("CC5", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC6 { - get { - object obj = ResourceManager.GetObject("CC6", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC7 { - get { - object obj = ResourceManager.GetObject("CC7", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap CC8 { - get { - object obj = ResourceManager.GetObject("CC8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap End { - get { - object obj = ResourceManager.GetObject("End", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Hyphen { - get { - object obj = ResourceManager.GetObject("Hyphen", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num0 { - get { - object obj = ResourceManager.GetObject("Num0", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num1 { - get { - object obj = ResourceManager.GetObject("Num1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num2 { - get { - object obj = ResourceManager.GetObject("Num2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num3 { - get { - object obj = ResourceManager.GetObject("Num3", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num4 { - get { - object obj = ResourceManager.GetObject("Num4", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num5 { - get { - object obj = ResourceManager.GetObject("Num5", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num6 { - get { - object obj = ResourceManager.GetObject("Num6", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num7 { - get { - object obj = ResourceManager.GetObject("Num7", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num8 { - get { - object obj = ResourceManager.GetObject("Num8", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Num9 { - get { - object obj = ResourceManager.GetObject("Num9", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 型 System.Drawing.Bitmap のローカライズされたリソースを検索します。 - /// - internal static System.Drawing.Bitmap Start { - get { - object obj = ResourceManager.GetObject("Start", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/ZipConvertCustomerBarCode/Properties/Resources.resx b/ZipConvertCustomerBarCode/Properties/Resources.resx deleted file mode 100644 index e0f2d53..0000000 --- a/ZipConvertCustomerBarCode/Properties/Resources.resx +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\c1.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c2.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c3.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c4.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c5.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c6.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c7.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\c8.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\e.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\-.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\0.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\1.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\2.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\3.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\4.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\5.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\6.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\7.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\8.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\9.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\s.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/ZipConvertCustomerBarCode/Resources/-.gif b/ZipConvertCustomerBarCode/Resources/-.gif deleted file mode 100644 index 3a1f24b1f331334fd204a37ef528db22e0daf182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmZ?wbh9u|XZ diff --git a/ZipConvertCustomerBarCode/Resources/1.gif b/ZipConvertCustomerBarCode/Resources/1.gif deleted file mode 100644 index 6ebc6d18785cda12c5427869995ebdfbd3fd40fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 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 z zp7dGvZYv2*XMnf%^IJ*C=2!`{=%{ESVhABZdPhLZPR-54==iDWiP56-d|JTpu)HVx zx)RvXcUDTbY~#u|qXWMG&~EZbkPhf|B|s;J2vw&<(iL3uh7`~Up&=^iQ0S`zsNV{5 z6)=Tzt~?)s5yRIT?CoQ-5hcWO6@^+LQJ_jxvv|ism2yd0ANMlvWfJ?#bbL? z*E289d*|`KlwGAfz@!p7M5+mo$PZA3pNq-xQDo)m?ceNRaDQpDgj+qp3xU_)z#!#3 z9hu}+As(Z=ph7H{o@U#W>;fHrRWRUzr?qN8iDgl8CN90lrj>9su4vY=%f$yxj(i!S z#SPAc@)uD!Q4CI2j*8}MI-jCR2J^Y;%d61Od00$g-OrgPs6MGwN$ejjs_0-)n)WiB z&~BU#$Wp{u%fO);Vf;=>Vkqv}0}WLy8rmv=XO{ZxwihJVFF%*2V#qkSUlXUJ9ZvFQ zi>fThRdf`P*hs1dUANu=N0*I*@ot|Xw>%JCiZKmi7cJY~hNAa9#Md7ukoV>+1m-O@ z{`a^hQJoA#F;=sS$ZJ z=^u$}L(&Fomx3a9bnOoeCbxd6tkpjp>5W$CzQA41x72g0)P4SrkJesoaLv#tT$Rwz z2;0sO|H~X^sxm>4KIWH2|2f0+O@qY9eb~jl;%IXCgW@=5oj+znPU`B$DR)z!2Qu;HbRzdk zU5Iev<()MTxL4>a-79)V9uC?o`J@xt8wXmi=S-3pv6E?@e*#~ZALh}rELPU0W3FDk zS7@e6-V%1yT@r5`NkTt@wkH`2gpZ`79Z|cXBzHz`8Me|vB(CEbcPGHd;XWz!Y1hvE zV$vYMWX0H8it9K`=?1U%I23n=(jZn&Sb!^*8LBpYR91^x5`l+e`P=l*8%1j^S;3Uz zZEX0%0r$IBz0;k3g5jP{tA&KCbXZFnMS_JNg5`GptzWYE)#VoYHwrFn5e4y6Z|DV* ziB!odgRrudssv_HY)LA<88TFNdsRts7^;a3WuA-9I#-&N`th)N5xL))G0k}dNhq53 zsVgI?ox~;r$5KlaQ4i;Lmr$r|HIj+0gJmFj6@pjABua-lx4DR=FMipmj^H zSwSOGVpxDa@Nr{WNMB^;2#HTCwcTNkjg;FLn>W&m?<6_n=Z6!8t5Izp|3P459BOao z#1lSSGI;q}zuXu}1D(euw7CG#dA8t&Ink=+6a{q8A+1lWU( zZCUkPuS6{Nq!3+7NNod7^$68u8S;8BkMsbqCGcVDnE2|T2Tur)HP0+kNk-!&TiS%P z9lMW8V$07-TcqAokiZVz0yptcOIQRev}Y2>S`*b;n-icfJQdd>xOO92-m2;C>^mC@ zVIJ(3L=}2CsK1-1$zn&q@e=nF(kz_}!1C$6wL-`k^67ScAD{|&6^x0sXVxip2D9d1 z<44VUu7E`n9qd8Xw##M;&WmOs-6p;8RIa5NBSsd3GNKwtDSq=B*MkU~GZw^dK2C@h zJ_sMVt-8iUdUTDJv8wO3?#-LNwWQYFiSR~Bi*`c_|ZIBJthcdU5JaREnP>}Y-|Kp<$) zI7cQbtzPMJfITVNe@&qK$J97z7e_r0u{iO9c^kiGpOo#NkB^Q8P#{ zo8T|c@sY$Bq~AHt6*%3^zY)3}xe3Xo!MF99tyA;{NbV8sJHgcHydDHd<)gnhU|Vt^SBoAxTkz@4{Gz~K4g4YVp*c6lMZI$ zd1sP6WYSw_GE~;_-t6J0S6}n5p98%9uXC##{+^S*Lj1YeoA#eg(btLpbq_YipUvLx c!$n!Pf6i^(otM5J_RUF(ST+7USrhR80N1&=vj6}9 diff --git a/ZipConvertCustomerBarCode/Resources/3.gif b/ZipConvertCustomerBarCode/Resources/3.gif deleted file mode 100644 index 62f807e85a3027e80451723f067304b6537d0e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbh9u|d(Q%T02t MT98rd!N_0@00~?X@c;k- diff --git a/ZipConvertCustomerBarCode/Resources/9.gif b/ZipConvertCustomerBarCode/Resources/9.gif deleted file mode 100644 index 1ca34c4435a0dd57ef5d8f7049fd2d9b0b33c85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmZ?wbh9u|-TyW&#rl_+d6+m LYglC&D}yxv6l4=% diff --git a/ZipConvertCustomerBarCode/Resources/c1.gif b/ZipConvertCustomerBarCode/Resources/c1.gif deleted file mode 100644 index 4c5a124b5846becf0a9113b52c48899431022ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmZ?wbh9u|lF(!`}DdN*P0gH^u47q L?ZI|iRt9ST3+odJ diff --git a/ZipConvertCustomerBarCode/Resources/c2.gif b/ZipConvertCustomerBarCode/Resources/c2.gif deleted file mode 100644 index f3271cb01f9fb38914e81456faccf75786b91c46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbh9u|03(923KBZ%**%JX`B|E Lc_&bgmBAVS0G|=k diff --git a/ZipConvertCustomerBarCode/Resources/c5.gif b/ZipConvertCustomerBarCode/Resources/c5.gif deleted file mode 100644 index ca0fa63f7094341d6bcb381f59fd37d3a04d94f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbh9u|VNv~>YBJ$hZq&1dt@dnStI KEvgh_um%9_h7q3t diff --git a/ZipConvertCustomerBarCode/Resources/c7.gif b/ZipConvertCustomerBarCode/Resources/c7.gif deleted file mode 100644 index ccdf2ae7abf4ae3b222f486da541477ae40c8a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbh9u| - + + - Debug - AnyCPU - 8.0.30703 - 2.0 - {AF6583CF-653D-42F8-A286-526D9A8EBF03} - Library - Properties - ZipConvertCustomerBarCode - ZipConvertCustomerBarCode - v4.0 - 512 + netstandard2.0 + 郵便番号・住所から日本郵便のカスタマバーコードを生成する(描画ライブラリ非依存) + true - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - - - - - - - - - - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - \ No newline at end of file + + diff --git a/global.json b/global.json new file mode 100644 index 0000000..3140116 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "test": { + "runner": "Microsoft.Testing.Platform" + } +}