質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

6922閲覧

【C#】Magick.netでPSDファイルをレイヤーごとに分けてPNGにする方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/29 13:36

編集2016/12/30 09:06

###前提・実現したいこと
psdをレイヤー別にpngで保存する方法に書いてある

convert hoge.psd -set dispose Background -coalesce -delete 0 fuga_%04d.png

というImageMagickのコマンドと同じ結果をMagick.netを使って実現したい。
どなたか参考になりそうなサイト、もしくは方法をご存知の方がいれば教えてください。

###該当のソースコード

C#

1using ImageMagick; 2 3namespace psd 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 ImageMagick.MagickReadSettings settings = 10 new ImageMagick.MagickReadSettings(); 11 12 settings.BackgroundColor = new MagickColor(); 13 14 MagickImageCollection imgs = 15 new ImageMagick.MagickImageCollection("読み込みたいPSDファイル.psd", settings); 16 17 imgs.Coalesce(); 18 imgs.RemoveAt(0); 19 20 imgs.Write("変換したPNGファイル.png"); 21 22 imgs.Dispose(); 23 } 24 } 25}

ImageMagickのコマンドの「Background」と「delete 0」をMagick.netでどのように書けばよいのか分かりません。
このプログラムは「Magick.NETを使って、.NETがサポートしていない形式の画像を読み込む」というサイトのPDFを画像にするプログラムを参考に作りました。
実行すると、PSDファイルがレイヤーごとにPNGに変換されます。
画像の大きさを統一する目的で「Coalesce」を入れてみましたが、これによってレイヤーがどんどん合体しながらPNGになるので注意が必要です。
「Coalesce」なしでもPSDをPNGにすることができます。
背景を透明にする目的で「settings.BackgroundColor」を入れてみました。

2016/12/30追記
「delete 0」と同じく画像の先頭を削除する方法は分かりました。引き続き背景を透明にする方法を調査中です。
他の方法として、imgs[0]と同じ大きさの透明の画像を作ってそこにimgsからとったimageをくっつけて画像にするということも試しています。
canvasのサイズだけを変更するという方法も調査中です。

###試したこと
現在も継続して解決方法を調べています。

###補足情報(言語/FW/ツール等のバージョンなど)
C#のプログラムを動かすのに必要なもの「Magick.net」
参考
.NET 用パッケージマネージャー NuGet のインストールと使い方
Magick.NETを使って、.NETがサポートしていない形式の画像を読み込む

Ruby

1require"mini_magick" 2 3MiniMagick::Tool::Convert.new do |convert| 4 convert << "読み込みたいPSDファイル.psd" 5 convert.set("dispose") 6 convert << "Background" 7 convert.coalesce 8 convert.delete(0) 9 convert << "変換したPNGファイル.png" 10end

RubyとMiniMagickで上のコマンドを書くとこんな感じになります。結局、ocraでexe化できなかったのでC#で同じことをやろうとしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Magick.NET様の方で質問をして無事解決しました。
dlemstra様本当にありがとうございました。

dlemstra様に教えていただいたコード。(CodePlexがシャッドダウン?されるそうなので追記。)

C#

1using ImageMagick; 2 3namespace psd 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 using (MagickImageCollection imgs = new MagickImageCollection("psdfile.psd")) 10 { 11 foreach (MagickImage img in imgs) 12 { 13 img.GifDisposeMethod = GifDisposeMethod.Background; 14 } 15 16 imgs.Coalesce(); 17 imgs.RemoveAt(0); 18 19 imgs.Write("pngfile%04d.png"); 20 } 21 } 22 } 23} 24

私の質問のURL
How to write Background?

以前のコードだとPSDファイルによってはメモリを大量に使うことになっていたのでそれに対応しました。

C#

1using System; 2using ImageMagick; 3 4namespace psdconvert1 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 using (MagickImageCollection imgs = new MagickImageCollection("psd.psd")) 11 { 12 int width = imgs[0].Width; 13 int height = imgs[0].Height; 14 15 //imgs[0]は個人の好みで入れていない。 16 for (int i = 1; i < imgs.Count; i++) 17 { 18 //レイヤーの大きさを統一している。for_coalesceを外に置いておくとエラーが発生する。 19 using (MagickImageCollection result = new MagickImageCollection()) 20 { 21 MagickColor transparent = new MagickColor(0, 0, 0, 0); 22 MagickImage for_coalesce = new MagickImage(transparent, width, height); 23 for_coalesce.BackgroundColor = transparent; 24 25 result.Add(for_coalesce); 26 result.Add(imgs[i]); 27 28 result.Coalesce(); 29 30 result[1].Write($"psd\\{String.Format("{0:D6}", i - 1)}.png"); 31 } 32 33 //定期的にGCを入れないとメモリの使用量が大変なことになる。 34 if (i % 20 == 0) 35 { 36 GC.Collect(); 37 GC.WaitForPendingFinalizers(); 38 GC.Collect(); 39 } 40 } 41 } 42 } 43 } 44} 45

投稿2016/12/30 17:03

編集2017/06/07 14:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問