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 0000000..47162fc Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-0.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-1.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-1.png new file mode 100644 index 0000000..51090f1 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-1.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-10.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-10.png new file mode 100644 index 0000000..62513d8 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-10.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-11.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-11.png new file mode 100644 index 0000000..9130cad Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-11.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-12.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-12.png new file mode 100644 index 0000000..b381ab0 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-12.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-13.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-13.png new file mode 100644 index 0000000..cb6a357 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-13.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-14.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-14.png new file mode 100644 index 0000000..9be2c80 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-14.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-15.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-15.png new file mode 100644 index 0000000..8efc39c Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-15.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-17.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-17.png new file mode 100644 index 0000000..6712044 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-17.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-18.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-18.png new file mode 100644 index 0000000..4208f98 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-18.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-19.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-19.png new file mode 100644 index 0000000..1066385 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-19.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-2.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-2.png new file mode 100644 index 0000000..47162fc Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-2.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-21.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-21.png new file mode 100644 index 0000000..b8c9636 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-21.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-3.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-3.png new file mode 100644 index 0000000..cdd7f29 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-3.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-4.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-4.png new file mode 100644 index 0000000..05bc13a Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-4.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-5.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-5.png new file mode 100644 index 0000000..750b16f Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-5.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-6.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-6.png new file mode 100644 index 0000000..c858bcb Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-6.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-7.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-7.png new file mode 100644 index 0000000..2bb05eb Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-7.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-8.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-8.png new file mode 100644 index 0000000..d9e78fb Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-8.png differ diff --git a/ZipConvertCustomerBarCode.Tests/TestData/v1-9.png b/ZipConvertCustomerBarCode.Tests/TestData/v1-9.png new file mode 100644 index 0000000..4d0c617 Binary files /dev/null and b/ZipConvertCustomerBarCode.Tests/TestData/v1-9.png differ 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 3a1f24b..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/-.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/0.gif b/ZipConvertCustomerBarCode/Resources/0.gif deleted file mode 100644 index 20224a2..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/0.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/1.gif b/ZipConvertCustomerBarCode/Resources/1.gif deleted file mode 100644 index 6ebc6d1..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/1.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/2.gif b/ZipConvertCustomerBarCode/Resources/2.gif deleted file mode 100644 index c684351..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/2.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/3.gif b/ZipConvertCustomerBarCode/Resources/3.gif deleted file mode 100644 index 62f807e..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/3.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/4.gif b/ZipConvertCustomerBarCode/Resources/4.gif deleted file mode 100644 index 89b3bd2..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/4.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/5.gif b/ZipConvertCustomerBarCode/Resources/5.gif deleted file mode 100644 index ad9ffea..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/5.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/6.gif b/ZipConvertCustomerBarCode/Resources/6.gif deleted file mode 100644 index f6ec783..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/6.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/7.gif b/ZipConvertCustomerBarCode/Resources/7.gif deleted file mode 100644 index c09fd6e..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/7.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/8.gif b/ZipConvertCustomerBarCode/Resources/8.gif deleted file mode 100644 index 21cd3e8..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/8.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/9.gif b/ZipConvertCustomerBarCode/Resources/9.gif deleted file mode 100644 index 1ca34c4..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/9.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c1.gif b/ZipConvertCustomerBarCode/Resources/c1.gif deleted file mode 100644 index 4c5a124..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c1.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c2.gif b/ZipConvertCustomerBarCode/Resources/c2.gif deleted file mode 100644 index f3271cb..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c2.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c3.gif b/ZipConvertCustomerBarCode/Resources/c3.gif deleted file mode 100644 index a2b2c77..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c3.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c4.gif b/ZipConvertCustomerBarCode/Resources/c4.gif deleted file mode 100644 index 02be090..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c4.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c5.gif b/ZipConvertCustomerBarCode/Resources/c5.gif deleted file mode 100644 index ca0fa63..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c5.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c6.gif b/ZipConvertCustomerBarCode/Resources/c6.gif deleted file mode 100644 index d3f2616..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c6.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c7.gif b/ZipConvertCustomerBarCode/Resources/c7.gif deleted file mode 100644 index ccdf2ae..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c7.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/c8.gif b/ZipConvertCustomerBarCode/Resources/c8.gif deleted file mode 100644 index c704c20..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/c8.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/e.gif b/ZipConvertCustomerBarCode/Resources/e.gif deleted file mode 100644 index 1f0ace5..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/e.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/Resources/s.gif b/ZipConvertCustomerBarCode/Resources/s.gif deleted file mode 100644 index b0575ec..0000000 Binary files a/ZipConvertCustomerBarCode/Resources/s.gif and /dev/null differ diff --git a/ZipConvertCustomerBarCode/ZipConvertCustomerBarCode.csproj b/ZipConvertCustomerBarCode/ZipConvertCustomerBarCode.csproj index 493f67c..b151451 100644 --- a/ZipConvertCustomerBarCode/ZipConvertCustomerBarCode.csproj +++ b/ZipConvertCustomerBarCode/ZipConvertCustomerBarCode.csproj @@ -1,89 +1,9 @@ - - + + - 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" + } +}