DOBON.NET DOBON.NETプログラミング掲示板過去ログ

7の64BITマシンでGIF画像を保存すると

環境/言語:[WINDOWS7(x64) .NET Framework3.5 VB.NET2008]
分類:[.NET]

2011/02/26(Sat) 00:40:00 編集(投稿者)

こんにちは
いつもお世話になっています
件名の問題ですが以下のような形になっています
少しでも心あたりのある方はお力をお貸しください

マシン  WINDOWS7(x64)
仕様言語 VB.NET2008

SAVE関数でGIF画像を作成したところ
WINDOWS基準のPAINTや、PAINTSHOPでは
開けるのですがPHOTOSHOPでは開けない画像が
できてしまいました。
画像フォーマットをGIFからPNGに変えたところ
すべてのソフトで表示することが出来ました。
描画で使っている色は原色やWEBセーフカラー以外のを
使っています。
使っている色によってはこのようなことが
起きるものなのでしょうか?

また、試しに32BITのXPでこのプログラムをつかって
GIF画像を作成したところすべてのソフトで表示することが出来ました

以上です宜しくお願いいたします。
2011/02/25(Fri) 20:30:22 編集(投稿者)

■No28253に返信(raurauさんの記事)
> SAVE関数でGIF画像を作成したところ
GifBitmapEncoder クラスの Save メソッドの事でしょうか。
それとも、Bitmap/Image クラスの Save メソッドの事でしょうか?

(VB2008 には、Save という名の組み込み関数は無かったはずなので…)


> PHOTOSHOPでは開けない画像ができてしまいました。
現象を再現可能な具体的なミニマムコードを提示できますか?
もしくは、XP(x86) と 7(x64)それぞれで作成した画像を zip にして
掲示板にアップロードできますか?
意味不明な書き方をしてすみません

使用しているsaveはBitmapクラスのsaveです。
■No28255に返信(raurauさんの記事)
> 使用しているsaveはBitmapクラスのsaveです。

どういったコードで保存していますか?
実際のコードにそのままか、近いものを書いてみてください。

念のため:きちんと ImageFormat.Gif を指定されているのですよね?
http://msdn.microsoft.com/ja-jp/library/9t4syfhh.aspx
返信ありがとうございます
ミニマム過ぎかもしれませんが以下のような形です

bmpBasemap = New Bitmap(intWidth, intHeight)

g = Graphics.FromImage(bmpBasemap)

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor

g.FillRectangle(drawB, 0, 0, intWidth, intHeight)

****実際にはここにDrawImageやFillRectangleを使った描画部があります*****

g.Dispose()

bmpBasemap.Save(strMakeMapPath, Drawing.Imaging.ImageFormat.Gif)
bmpBasemap.Dispose()
■No28258に返信(raurauさんの記事)
実験できていませんが、切り分けのために提案します。

> bmpBasemap = New Bitmap(intWidth, intHeight)
> bmpBasemap.Save(strMakeMapPath, Drawing.Imaging.ImageFormat.Gif)
> bmpBasemap.Dispose()

最小限のこの形(Graphics でいろいろと操作しない)とした場合、全体が真っ黒で保存されるはずですが、この場合に問題は発生しますか?


# Windows 7 だと WIC を使うようになったという記事は読んだ覚えがある。
# Photoshop で読めない要因はわかりませんが。
# 出力された画像の 1 ピクセルあたりのビット数など、細かいところで見比べると
# 何か見えてくるかもしれませんね。(読める画像と読めない画像)
2011/02/26(Sat) 13:19:25 編集(投稿者)
2011/02/26(Sat) 13:19:21 編集(投稿者)

早速の返信ありがとうございます
最小限の形の場合は特に問題がありませんでした

>>bmpBasemap = New Bitmap(intWidth, intHeight)
>>bmpBasemap.Save(strMakeMapPath, Drawing.Imaging.ImageFormat.Gif)
>>bmpBasemap.Dispose()
すべてのファイルが見れないわけじゃないようです
100枚描画したうちの1,2枚が見れなくなっているようです。

そのファイルはペイントでGIFに保存しなおしても同じ
状況ですがPaintShopで保存しなおすとPotoShopでも見れるようになりました。

試しにバージョンの違うVB.net2002で開いて違うファイル名の
GIF画像に保存しなおすというプログラムを作成し試してみましたが
駄目でした・・

頻度的には稀なのですが気持ち悪いので
PNGかBMPで一回作画してその作画した画像を
.Net以外の仕様言語でGIFに変換した方が
良さそうですかね・・
■No28263に返信(raurauさんの記事)
> そのファイルはペイントでGIFに保存しなおしても同じ
> 状況ですがPaintShopで保存しなおすとPotoShopでも見れるようになりました。
GDI+ 側に問題があって、作成されたファイルに障害がおきているのか、
それとも PhotoShop 側の解釈に問題があるのか、再現性が不明ですね…。


> 100枚描画したうちの1,2枚が見れなくなっているようです。
その1,2枚に相当する描画データを同じ手順で作成した場合、
常に XP 機では正常、7x64機では失敗という事になるのでしょうか。

それとも、同じデータであって再現性が無く、数パーセントの確率で
読み込めないファイルが出来てしまっているのでしょうか。


もしも OS の違いによる再現性があるのならば、作成されたファイルのバイナリを比較して、
どこに差異があったのかを特定することができないでしょうか。問題箇所がわかれば、
作成したファイルを事後修正することで、とりあえず回避できるかも知れません。
返信ありがとうございます。

>その1,2枚に相当する描画データを同じ手順で作成した場合、
>常に XP 機では正常、7x64機では失敗という事になるのでしょうか。
同じ描画の場合は10回以下しか試してませんが
7x64機では全部同じ画像がだめになりました。

明日あたりにでも、データの再照らし合せと
データ的には存在するからPAINTでは表示できると考え
最終列と次の0列目が同じ色になることがあるので
改行がもしかしたらPHOTOSHOP側で認識できないのかの
一縷の望みをかけて最終列の色を黒一色で塗って試してみます!

あとPNG→GIFの調査とPNGで保存した場合の色が変じゃないかなどの
確認をしてみたいと思います。
こんにちは

XPと7x64で作画したものをバイナリで見たところ
微妙な差異がありました。
パレットの部分までは同一でありデータ部に入ると
片方にはあるが片方にはない1バイトが約110バイトおきに
存在していました。
GIFにとってはどちらが正しいフォーマットなのかは解りませんが。。
今回はXPの方で作画することにしました。
OSによる画像の中身の差異については
マイクロソフトにちょっと聞いてみようとは思います。

返信ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板