C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: Psd parser(C#)でPSDを読み込む


(過去ログ 122 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■72871 / inTopicNo.1)  Psd parser(C#)でPSDを読み込む
  
□投稿者/ Aria (1回)-(2014/07/29(Tue) 19:09:57)

分類:[C#] 

現在、C#でPSD画像情報を抽出するツール開発をしています。
C#でのPSD読み込みのプログラムとして、Psd parserがあることがわかり、プログラ ムを実行し、PSD画像をD&D読み込んだのですが、以下のコードの部分でエラーが発生しました。

具体的にはnLengs*2が負の値となってしまい、エラーが発生しました。

どなたか解決方法がわかる方がいれば教えて下さい。

(自分で原因を考えたところ、このプログラムは2006年頃に開発されたものなので、いまのPSDとフォーマットが違うのでは無いかと考えられました。ただ、解決方法まではわかりませんでした。)

--------------------------
コード
--------------------------
BinaryPSDReader.cs
public string ReadPSDUnicodeString()
{
int nLength = (int)this.ReadUInt32();

MessageBox.Show(nLength.ToString());

byte[] data = base.ReadBytes(nLength*2);

string s = Encoding.BigEndianUnicode.GetString(data);

return s;
}



--------------------------
エラー文
--------------------------
型 'System.ArgumentOutOfRangeException' の初回例外が mscorlib.dll で発生しました
追加情報:負の値ではない数値が必要です。
--------------------------

参考サイト : http://tmp.junkbox.info/e40.html

引用返信 編集キー/
■72872 / inTopicNo.2)  Re[1]: Psd parser(C#)でPSDを読み込む
□投稿者/ Azulean (327回)-(2014/07/29(Tue) 22:42:03)
No72871 (Aria さん) に返信
> 現在、C#でPSD画像情報を抽出するツール開発をしています。
> C#でのPSD読み込みのプログラムとして、Psd parserがあることがわかり、プログラ ムを実行し、PSD画像をD&D読み込んだのですが、以下のコードの部分でエラーが発生しました。

ファイルサイズはどのくらいなんでしょうか。
2GB を超えているのなら、「そうなるんじゃない?」と思えるソースコードとなっています。


> 具体的にはnLengs*2が負の値となってしまい、エラーが発生しました。

フォーマットが変わっておらず、nLength * 2 が負の値になるのなら、ファイルサイズは 2GB を超えていることになります。
そうでないならフォーマットが変わっているか、壊れているかでしょう。


> (自分で原因を考えたところ、このプログラムは2006年頃に開発されたものなので、いまのPSDとフォーマットが違うのでは無いかと考えられました。ただ、解決方法まではわかりませんでした。)

仮にそうだとすれば、フォーマットを調査し、ソースコードに必要な改良を加えるか、新しいフォーマットに対応したライブラリを調査することが解決方法でしょう。
出来合いのライブラリを 100% 信用するのではなく、フォーマットに対して知識を持って判断できるようにした方がよいと思います、そのフォーマットに対応したソフトを作るのであれば。
引用返信 編集キー/
■72873 / inTopicNo.3)  Re[2]: Psd parser(C#)でPSDを読み込む
□投稿者/ Aria (2回)-(2014/07/29(Tue) 22:58:07)
ファイルサイズは10MB程度です。
なので、やはりフォーマットが違うみたいですね。

もし、どこを直せばよいかわかる方がいれば、
ご教授下さい。
引用返信 編集キー/
■72881 / inTopicNo.4)  Re[3]: Psd parser(C#)でPSDを読み込む
□投稿者/ aria (1回)-(2014/07/30(Wed) 14:05:29)
PSDファイルをもう一度GIMPで保存したところ、上記のエラーは回避できました。
おそらく、PSDファイルが壊れていたのだと思います。すみませんでした。

しかし、以下のコードの部分でエラーが発生しました。

どなたか解決方法がわかる方がいれば教えてください。


--------------------------
コード
--------------------------
PixelData.cs

public byte[] ReadPixels(BinaryPSDReader reader, Compression compression)
{
int bytesPerPixelPerChannel = this._bitsPerPixel / 8; // psd.Header.Depth / 8;
if (bytesPerPixelPerChannel < 1)
bytesPerPixelPerChannel = 1;

int bytesPerRow = this._width * bytesPerPixelPerChannel;
int totalBytes = bytesPerRow * this._height;

byte[] pData = new byte[totalBytes];

switch (compression)
{
case Compression.None:
reader.Read(pData, 0, totalBytes);
break;

case Compression.Rle:
for (int i = 0; i < this._height; i++)
{
int offset = i * this._width;
int numDecodedBytes = 0;
int numChunks = 0;
while (numDecodedBytes < this._width)
{
numDecodedBytes += Endogine.Serialization.RleCodec.DecodeChunk(reader.BaseStream, pData, offset + numDecodedBytes);
numChunks++;
}
}
break;


case Compression.ZipNoPrediction:
throw (new Exception("ZIP without prediction, no specification"));

case Compression.ZipPrediction:
throw (new Exception("ZIP with prediction, no specification"));


default:
throw (new Exception("Compression not defined: " + compression));  ← 【この部分】

}



--------------------------
エラー文
--------------------------
型 'System.Exception' の初回例外が Endogine.Codecs.Photoshop.dll で発生しました

追加情報:Compression not defined: 52966
--------------------------

参考サイト : http://tmp.junkbox.info/e40.html

引用返信 編集キー/
■72885 / inTopicNo.5)  Re[4]: Psd parser(C#)でPSDを読み込む
□投稿者/ Aria (3回)-(2014/07/30(Wed) 16:41:33)
度々すみません。

正確には、return pData;の部分でエラーとなっていました。
エラーの際のpDataの数値を確認したところ、261120となっていました。

このエラーの原因がわかる方がいれば教えてください。

できれば、解決方法もご教授いただければ幸いです。

--------------------------
コード
--------------------------
public byte[] ReadPixels(BinaryPSDReader reader, Compression compression)
{
int bytesPerPixelPerChannel = this._bitsPerPixel / 8; // psd.Header.Depth / 8;
if (bytesPerPixelPerChannel < 1)
bytesPerPixelPerChannel = 1;

int bytesPerRow = this._width * bytesPerPixelPerChannel;
int totalBytes = bytesPerRow * this._height;

byte[] pData = new byte[totalBytes];

switch (compression)
{
case Compression.None:
reader.Read(pData, 0, totalBytes);
break;

case Compression.Rle:
for (int i = 0; i < this._height; i++)
{
int offset = i * this._width;
int numDecodedBytes = 0;
int numChunks = 0;
while (numDecodedBytes < this._width)
{
numDecodedBytes += Endogine.Serialization.RleCodec.DecodeChunk(reader.BaseStream, pData, offset + numDecodedBytes);
numChunks++;
}
}
break;


case Compression.ZipNoPrediction:
throw (new Exception("ZIP without prediction, no specification"));

case Compression.ZipPrediction:
throw (new Exception("ZIP with prediction, no specification"));


default:
throw (new Exception("Compression not defined: " + compression));

}

return pData; ← 【この部分】
}
引用返信 編集キー/
■72888 / inTopicNo.6)  Re[5]: Psd parser(C#)でPSDを読み込む
□投稿者/ Aria (4回)-(2014/07/30(Wed) 17:07:07)
さらに解析を進めたところ、引数であるcompression(圧縮形式?)が「None」や「Rle」ではなく、
数値であることが判明し、それが原因ではないかと考えられました。

このエラーの原因がわかる方がいれば教えてください。

できれば、解決方法もご教授いただければ幸いです。

------------------
public byte[] ReadPixels(BinaryPSDReader reader, Compression compression)
------------------
引用返信 編集キー/
■72892 / inTopicNo.7)  Re[6]: Psd parser(C#)でPSDを読み込む
□投稿者/ amagi (4回)-(2014/07/31(Thu) 00:10:05)
解決しました。

Paint.netで一度保存してから実行するとうまくいきました。
お騒がせしました
解決済み
引用返信 編集キー/
■72895 / inTopicNo.8)  Re[7]: Psd parser(C#)でPSDを読み込む
□投稿者/ Azulean (329回)-(2014/07/31(Thu) 07:19:47)
No72892 (amagi さん) に返信
> 解決しました。

Aria さんと amagi さんは同じ方という理解で問題ないでしょうか。
そうであれば PSD という同じネタで名前を使い分けるのは避けていただけますでしょうか。
解決済み
引用返信 編集キー/
■72896 / inTopicNo.9)  Re[8]: Psd parser(C#)でPSDを読み込む
□投稿者/ Aria (5回)-(2014/07/31(Thu) 07:41:06)
すみません。
以後気をつけます。
引用返信 編集キー/
■72913 / inTopicNo.10)  Re[9]: Psd parser(C#)でPSDを読み込む
□投稿者/ Aria (6回)-(2014/08/01(Fri) 11:54:16)
No72896 (Aria さん) に返信
> すみません。
> 以後気をつけます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -