From 4337670f46ee3c7cd932f1b7e41e9c4a8c79feba Mon Sep 17 00:00:00 2001 From: hiroygo Date: Sun, 5 Jul 2020 14:52:26 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=E7=84=A1=E8=A6=96=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 354 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 354 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39a03ac --- /dev/null +++ b/.gitignore @@ -0,0 +1,354 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# add +*.o +.vscode/ \ No newline at end of file From 439bdeac0ef9b8d8ceb2893eab1f896b876413c7 Mon Sep 17 00:00:00 2001 From: hiroygo Date: Tue, 7 Jul 2020 21:13:38 +0900 Subject: [PATCH 2/7] =?UTF-8?q?add=20=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/hiroygo/README.md | 41 ++++++++ kadai1/hiroygo/go.mod | 5 + kadai1/hiroygo/go.sum | 3 + kadai1/hiroygo/imgconv/imgconv.go | 138 +++++++++++++++++++++++++++ kadai1/hiroygo/main.go | 65 +++++++++++++ kadai1/hiroygo/testdata/go.bmp | Bin 0 -> 270054 bytes kadai1/hiroygo/testdata/go.gif | Bin 0 -> 3782 bytes kadai1/hiroygo/testdata/go.jpg | Bin 0 -> 10795 bytes kadai1/hiroygo/testdata/go.png | Bin 0 -> 6744 bytes kadai1/hiroygo/testdata/go.tiff | Bin 0 -> 360324 bytes kadai1/hiroygo/testdata/go_alpha.png | Bin 0 -> 6247 bytes kadai1/hiroygo/testdata/sub/go.jpg | Bin 0 -> 10795 bytes 12 files changed, 252 insertions(+) create mode 100644 kadai1/hiroygo/README.md create mode 100644 kadai1/hiroygo/go.mod create mode 100644 kadai1/hiroygo/go.sum create mode 100644 kadai1/hiroygo/imgconv/imgconv.go create mode 100644 kadai1/hiroygo/main.go create mode 100644 kadai1/hiroygo/testdata/go.bmp create mode 100644 kadai1/hiroygo/testdata/go.gif create mode 100644 kadai1/hiroygo/testdata/go.jpg create mode 100644 kadai1/hiroygo/testdata/go.png create mode 100644 kadai1/hiroygo/testdata/go.tiff create mode 100644 kadai1/hiroygo/testdata/go_alpha.png create mode 100644 kadai1/hiroygo/testdata/sub/go.jpg diff --git a/kadai1/hiroygo/README.md b/kadai1/hiroygo/README.md new file mode 100644 index 0000000..ac6ce9c --- /dev/null +++ b/kadai1/hiroygo/README.md @@ -0,0 +1,41 @@ +# 課題1 +## 【TRY】画像変換コマンドを作ろう +### 次の仕様を満たすコマンドを作って下さい +* ディレクトリを指定する +* 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) +* ディレクトリ以下は再帰的に処理する +* 変換前と変換後の画像形式を指定できる(オプション) + +### 以下を満たすように開発してください +* mainパッケージと分離する +* 自作パッケージと標準パッケージと準標準パッケージのみ使う + * 準標準パッケージ:golang.org/x以下のパッケージ +* ユーザ定義型を作ってみる +* GoDocを生成してみる +* Go Modulesを使ってみる + +## 使用方法 +* jpg, png, tiff, bmp, gif に対応しています + +``` +$ ./imgcnv -h +Usage of ./imgcnv: + -d string + 変換の対象となる画像が格納されたディレクトリパス (default "./") + -i string + 変換の対象となる画像種別 (default "jpg") + -o string + 変換後の画像種別 (default "png") +``` + +## 実行例 +* 以下は testdata ディレクトリ内の tiff 画像を bmp 画像に変換して出力します + +``` +$ ./imgcnv -d testdata -i tiff -o bmp +``` + +## 感想 +* 画像変換は C++ と Windows Imaging Component の組み合わせで実装したことがありました。 +* この時は低レイヤーな関数を扱わなくてはいけなくて、苦労しました。 +* Go では抽象化された関数などが用意されていて、簡単に画像変換できました。 \ No newline at end of file diff --git a/kadai1/hiroygo/go.mod b/kadai1/hiroygo/go.mod new file mode 100644 index 0000000..d19da9a --- /dev/null +++ b/kadai1/hiroygo/go.mod @@ -0,0 +1,5 @@ +module github.com/gopherdojo/dojo8/kadai1/hiroygo + +go 1.14 + +require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai1/hiroygo/go.sum b/kadai1/hiroygo/go.sum new file mode 100644 index 0000000..394251b --- /dev/null +++ b/kadai1/hiroygo/go.sum @@ -0,0 +1,3 @@ +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai1/hiroygo/imgconv/imgconv.go b/kadai1/hiroygo/imgconv/imgconv.go new file mode 100644 index 0000000..daa8db5 --- /dev/null +++ b/kadai1/hiroygo/imgconv/imgconv.go @@ -0,0 +1,138 @@ +package imgconv + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" +) + +const ( + // Unknown 不明な画像 + Unknown ImageType = "unknown" + // Jpeg Jpeg 画像 + Jpeg ImageType = "jpg" + // Png Png 画像 + Png ImageType = "png" + // Tiff Tiff 画像 + Tiff ImageType = "tiff" + // Bmp Bmp 画像 + Bmp ImageType = "bmp" + // Gif Gif 画像 + Gif ImageType = "gif" +) + +// ImageType 画像種別 +type ImageType string + +func (t ImageType) String() string { + return string(t) +} + +// ToImageType 文字列を ImageType に変換する +// e.g. "jpg" => Jpeg +func ToImageType(s string) ImageType { + switch s { + case "jpeg", "jpg": + return Jpeg + case "png": + return Png + case "tiff": + return Tiff + case "bmp": + return Bmp + case "gif": + return Gif + default: + return Unknown + } +} + +func imageTypeFromFileName(name string) ImageType { + ext := strings.ToLower(filepath.Ext(name)) + ext = strings.Replace(ext, ".", "", -1) + return ToImageType(ext) +} + +// GetImageFilePathesRecursive ディレクトリ内の指定された画像種別のファイルパスを再帰的に返す +func GetImageFilePathesRecursive(dirPath string, target ImageType) ([]string, error) { + var pathes []string + err := filepath.Walk(dirPath, func(visitPath string, f os.FileInfo, err error) error { + if err != nil { + return fmt.Errorf("WalkFunc error, %w", err) + } + + if !f.Mode().IsRegular() { + return nil + } + + t := imageTypeFromFileName(f.Name()) + if t != target { + return nil + } + + pathes = append(pathes, visitPath) + return nil + }) + if err != nil { + return nil, fmt.Errorf("Walk error, %w", err) + } + + return pathes, nil +} + +// LoadImage 画像を読み込み、その Image を返す +func LoadImage(path string) (image.Image, error) { + f, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf("Open error, %w", err) + } + defer f.Close() + + img, _, err := image.Decode(f) + if err != nil { + return nil, fmt.Errorf("Decode error, %w", err) + } + + return img, nil +} + +// SaveImage Image を指定された画像形式で保存する +func SaveImage(m image.Image, out ImageType, savePath string) error { + if m == nil { + return fmt.Errorf("Image が nil です") + } + + f, err := os.Create(savePath) + if err != nil { + return fmt.Errorf("Create error, %w", err) + } + defer f.Close() + + switch out { + case Jpeg: + err = jpeg.Encode(f, m, nil) + case Png: + err = png.Encode(f, m) + case Tiff: + err = tiff.Encode(f, m, nil) + case Bmp: + err = bmp.Encode(f, m) + case Gif: + err = gif.Encode(f, m, nil) + default: + err = fmt.Errorf("画像種別 %s は不明です", out.String()) + } + if err != nil { + return fmt.Errorf("Encode error, %w", err) + } + + return nil +} diff --git a/kadai1/hiroygo/main.go b/kadai1/hiroygo/main.go new file mode 100644 index 0000000..04e0794 --- /dev/null +++ b/kadai1/hiroygo/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "flag" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/gopherdojo/dojo8/kadai1/hiroygo/imgconv" +) + +func getSaveFilePath(srcFilePath string, t imgconv.ImageType) string { + saveFileName := filepath.Base(srcFilePath) + saveFileName = strings.TrimSuffix(saveFileName, filepath.Ext(saveFileName)) + saveFileName += "." + t.String() + return filepath.Join(filepath.Dir(srcFilePath), saveFileName) +} + +func parseArgs() (dir string, in, out imgconv.ImageType, err error) { + d := flag.String("d", "./", "変換の対象となる画像が格納されたディレクトリパス") + i := flag.String("i", "jpg", "変換の対象となる画像種別") + o := flag.String("o", "png", "変換後の画像種別") + flag.Parse() + + in = imgconv.ToImageType(*i) + out = imgconv.ToImageType(*o) + if in == imgconv.Unknown || out == imgconv.Unknown { + in = imgconv.Unknown + out = imgconv.Unknown + err = fmt.Errorf("設定された画像種別が不正です") + return + } + + dir = *d + return +} + +func main() { + dir, inType, outType, err := parseArgs() + if err != nil { + fmt.Fprintln(os.Stderr, err) + return + } + + pathes, err := imgconv.GetImageFilePathesRecursive(dir, inType) + if err != nil { + fmt.Fprintln(os.Stderr, err) + return + } + + for _, path := range pathes { + m, err := imgconv.LoadImage(path) + if err != nil { + fmt.Fprintf(os.Stderr, "%s の読み込みに失敗しました。%v\n", path, err) + continue + } + + savePath := getSaveFilePath(path, outType) + if err := imgconv.SaveImage(m, outType, savePath); err != nil { + fmt.Fprintf(os.Stderr, "%s の保存に失敗しました。%v\n", savePath, err) + continue + } + } +} diff --git a/kadai1/hiroygo/testdata/go.bmp b/kadai1/hiroygo/testdata/go.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0516debb4f6f2390169bc6c2e19b6c336257ffab GIT binary patch literal 270054 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 CRVM%d literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/go.gif b/kadai1/hiroygo/testdata/go.gif new file mode 100644 index 0000000000000000000000000000000000000000..31350e1218a7255d25d46efa3fbe8190309e3f59 GIT binary patch literal 3782 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 literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/go.jpg b/kadai1/hiroygo/testdata/go.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46ed1e0c129dbaf4318e572999d7fbec3cee2e43 GIT binary patch literal 10795 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 P89HJhNRvWdY%l*G8r6`O literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/go.png b/kadai1/hiroygo/testdata/go.png new file mode 100644 index 0000000000000000000000000000000000000000..bf47390184a1fa8757fa10c54a4c4646b6554d48 GIT binary patch literal 6744 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 U(cX&S9T17Siq4brzwJW*1GL4<8UO$Q literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/go.tiff b/kadai1/hiroygo/testdata/go.tiff new file mode 100644 index 0000000000000000000000000000000000000000..d2b3b678a5cc8ca244b50bfe7d98fc174b26f40e GIT binary patch literal 360324 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 literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/go_alpha.png b/kadai1/hiroygo/testdata/go_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..138bcccd416ad8d26cfc2ef174649da95a009419 GIT binary patch literal 6247 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 literal 0 HcmV?d00001 diff --git a/kadai1/hiroygo/testdata/sub/go.jpg b/kadai1/hiroygo/testdata/sub/go.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46ed1e0c129dbaf4318e572999d7fbec3cee2e43 GIT binary patch literal 10795 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 P89HJhNRvWdY%l*G8r6`O literal 0 HcmV?d00001 From af28e97859dd3b7feb411e821cb1e8875a605d7e Mon Sep 17 00:00:00 2001 From: hiroygo Date: Wed, 8 Jul 2020 22:13:54 +0900 Subject: [PATCH 3/7] =?UTF-8?q?fix=20=E4=BD=8D=E7=BD=AE=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore => kadai1/hiroygo/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .gitignore => kadai1/hiroygo/.gitignore (100%) diff --git a/.gitignore b/kadai1/hiroygo/.gitignore similarity index 100% rename from .gitignore rename to kadai1/hiroygo/.gitignore From c514864780929824efee784a7c2e5888826f8be6 Mon Sep 17 00:00:00 2001 From: hiroygo Date: Thu, 9 Jul 2020 21:10:53 +0900 Subject: [PATCH 4/7] =?UTF-8?q?change=20=E5=A4=89=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/hiroygo/imgconv/imgconv.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kadai1/hiroygo/imgconv/imgconv.go b/kadai1/hiroygo/imgconv/imgconv.go index daa8db5..0511dd0 100644 --- a/kadai1/hiroygo/imgconv/imgconv.go +++ b/kadai1/hiroygo/imgconv/imgconv.go @@ -96,12 +96,12 @@ func LoadImage(path string) (image.Image, error) { } defer f.Close() - img, _, err := image.Decode(f) + m, _, err := image.Decode(f) if err != nil { return nil, fmt.Errorf("Decode error, %w", err) } - return img, nil + return m, nil } // SaveImage Image を指定された画像形式で保存する From 8e19bc5f4de8e65ec3f57608058edb4a135a3d46 Mon Sep 17 00:00:00 2001 From: hiroygo Date: Thu, 9 Jul 2020 21:24:39 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix=20=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=AEClose?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/hiroygo/imgconv/imgconv.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/kadai1/hiroygo/imgconv/imgconv.go b/kadai1/hiroygo/imgconv/imgconv.go index 0511dd0..bc1e4bc 100644 --- a/kadai1/hiroygo/imgconv/imgconv.go +++ b/kadai1/hiroygo/imgconv/imgconv.go @@ -105,16 +105,22 @@ func LoadImage(path string) (image.Image, error) { } // SaveImage Image を指定された画像形式で保存する -func SaveImage(m image.Image, out ImageType, savePath string) error { +func SaveImage(m image.Image, out ImageType, savePath string) (rerr error) { if m == nil { - return fmt.Errorf("Image が nil です") + rerr = fmt.Errorf("Image が nil です") + return } f, err := os.Create(savePath) if err != nil { - return fmt.Errorf("Create error, %w", err) + rerr = fmt.Errorf("Create error, %w", err) + return } - defer f.Close() + defer func() { + if err := f.Close(); err != nil { + rerr = fmt.Errorf("Close error, %w", err) + } + }() switch out { case Jpeg: @@ -131,8 +137,8 @@ func SaveImage(m image.Image, out ImageType, savePath string) error { err = fmt.Errorf("画像種別 %s は不明です", out.String()) } if err != nil { - return fmt.Errorf("Encode error, %w", err) + rerr = fmt.Errorf("Encode error, %w", err) } - return nil + return } From 1cd66ce87bc879235938c7527985e69a1a25e4a7 Mon Sep 17 00:00:00 2001 From: hiroygo Date: Thu, 9 Jul 2020 21:38:00 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix=20=E6=8B=A1=E5=BC=B5=E5=AD=90=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=E5=87=A6=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/hiroygo/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kadai1/hiroygo/main.go b/kadai1/hiroygo/main.go index 04e0794..84acfd5 100644 --- a/kadai1/hiroygo/main.go +++ b/kadai1/hiroygo/main.go @@ -5,14 +5,12 @@ import ( "fmt" "os" "path/filepath" - "strings" "github.com/gopherdojo/dojo8/kadai1/hiroygo/imgconv" ) func getSaveFilePath(srcFilePath string, t imgconv.ImageType) string { - saveFileName := filepath.Base(srcFilePath) - saveFileName = strings.TrimSuffix(saveFileName, filepath.Ext(saveFileName)) + saveFileName := filepath.Base(srcFilePath[:len(srcFilePath)-len(filepath.Ext(srcFilePath))]) saveFileName += "." + t.String() return filepath.Join(filepath.Dir(srcFilePath), saveFileName) } From b528c1c33fa21986963cc7d2b8b33c525b6db3fd Mon Sep 17 00:00:00 2001 From: hiroygo Date: Mon, 20 Jul 2020 22:45:48 +0900 Subject: [PATCH 7/7] =?UTF-8?q?improve=20=E8=AA=B2=E9=A1=8C2=E3=81=A7?= =?UTF-8?q?=E8=A1=8C=E3=81=A3=E3=81=9F=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0=E3=82=92=E9=81=A9=E5=BF=9C?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=8A=E3=81=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kadai1/hiroygo/imgconv/imgconv.go | 69 +++++++++++++++++++------------ kadai1/hiroygo/main.go | 11 +---- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/kadai1/hiroygo/imgconv/imgconv.go b/kadai1/hiroygo/imgconv/imgconv.go index bc1e4bc..a03b241 100644 --- a/kadai1/hiroygo/imgconv/imgconv.go +++ b/kadai1/hiroygo/imgconv/imgconv.go @@ -1,6 +1,7 @@ package imgconv import ( + "errors" "fmt" "image" "image/gif" @@ -56,15 +57,14 @@ func ToImageType(s string) ImageType { } func imageTypeFromFileName(name string) ImageType { - ext := strings.ToLower(filepath.Ext(name)) - ext = strings.Replace(ext, ".", "", -1) - return ToImageType(ext) + extWithoutDot := strings.TrimLeft(filepath.Ext(name), ".") + return ToImageType(strings.ToLower(extWithoutDot)) } -// GetImageFilePathesRecursive ディレクトリ内の指定された画像種別のファイルパスを再帰的に返す -func GetImageFilePathesRecursive(dirPath string, target ImageType) ([]string, error) { +// ImageFilePathesRecursive ディレクトリ内の指定された画像種別のファイルパスを再帰的に返す +func ImageFilePathesRecursive(dir string, target ImageType) ([]string, error) { var pathes []string - err := filepath.Walk(dirPath, func(visitPath string, f os.FileInfo, err error) error { + err := filepath.Walk(dir, func(visitPath string, f os.FileInfo, err error) error { if err != nil { return fmt.Errorf("WalkFunc error, %w", err) } @@ -104,40 +104,57 @@ func LoadImage(path string) (image.Image, error) { return m, nil } +// ReplaceExt 画像ファイルパスの拡張子を置換した結果を返す +func ReplaceExt(path string, replace ImageType) string { + newName := filepath.Base(path[:len(path)-len(filepath.Ext(path))]) + newName += "." + replace.String() + return filepath.Join(filepath.Dir(path), newName) +} + // SaveImage Image を指定された画像形式で保存する func SaveImage(m image.Image, out ImageType, savePath string) (rerr error) { if m == nil { - rerr = fmt.Errorf("Image が nil です") - return + return errors.New("Image が nil です") } - f, err := os.Create(savePath) - if err != nil { - rerr = fmt.Errorf("Create error, %w", err) - return - } - defer func() { - if err := f.Close(); err != nil { - rerr = fmt.Errorf("Close error, %w", err) - } - }() - + var encoder func(*os.File, image.Image) error switch out { case Jpeg: - err = jpeg.Encode(f, m, nil) + encoder = func(f *os.File, m image.Image) error { + return jpeg.Encode(f, m, nil) + } case Png: - err = png.Encode(f, m) + encoder = func(f *os.File, m image.Image) error { + return png.Encode(f, m) + } case Tiff: - err = tiff.Encode(f, m, nil) + encoder = func(f *os.File, m image.Image) error { + return tiff.Encode(f, m, nil) + } case Bmp: - err = bmp.Encode(f, m) + encoder = func(f *os.File, m image.Image) error { + return bmp.Encode(f, m) + } case Gif: - err = gif.Encode(f, m, nil) + encoder = func(f *os.File, m image.Image) error { + return gif.Encode(f, m, nil) + } default: - err = fmt.Errorf("画像種別 %s は不明です", out.String()) + return fmt.Errorf("画像種別 %s は不明です", out.String()) } + + f, err := os.Create(savePath) if err != nil { - rerr = fmt.Errorf("Encode error, %w", err) + return fmt.Errorf("Create error, %w", err) + } + defer func() { + if err := f.Close(); err != nil { + rerr = fmt.Errorf("Close error, %w", err) + } + }() + + if err := encoder(f, m); err != nil { + return fmt.Errorf("Encode error, %w", err) } return diff --git a/kadai1/hiroygo/main.go b/kadai1/hiroygo/main.go index 84acfd5..f203fd1 100644 --- a/kadai1/hiroygo/main.go +++ b/kadai1/hiroygo/main.go @@ -4,17 +4,10 @@ import ( "flag" "fmt" "os" - "path/filepath" "github.com/gopherdojo/dojo8/kadai1/hiroygo/imgconv" ) -func getSaveFilePath(srcFilePath string, t imgconv.ImageType) string { - saveFileName := filepath.Base(srcFilePath[:len(srcFilePath)-len(filepath.Ext(srcFilePath))]) - saveFileName += "." + t.String() - return filepath.Join(filepath.Dir(srcFilePath), saveFileName) -} - func parseArgs() (dir string, in, out imgconv.ImageType, err error) { d := flag.String("d", "./", "変換の対象となる画像が格納されたディレクトリパス") i := flag.String("i", "jpg", "変換の対象となる画像種別") @@ -41,7 +34,7 @@ func main() { return } - pathes, err := imgconv.GetImageFilePathesRecursive(dir, inType) + pathes, err := imgconv.ImageFilePathesRecursive(dir, inType) if err != nil { fmt.Fprintln(os.Stderr, err) return @@ -54,7 +47,7 @@ func main() { continue } - savePath := getSaveFilePath(path, outType) + savePath := imgconv.ReplaceExt(path, outType) if err := imgconv.SaveImage(m, outType, savePath); err != nil { fmt.Fprintf(os.Stderr, "%s の保存に失敗しました。%v\n", savePath, err) continue