- - PR -
C#での8bitグレースケールJpegの作成方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-16 18:36
素朴な疑問なんですが、「自然画」を扱うために定められた画像フォーマットである JPEG に「8bit グレースケール」なんて保存モードがあるんでしょうか? JPEG フォーマットが 24bit カラー前提の画像フォーマットであるなら、JPEG 形式で保存したものを素直に読み込めば 24bit カラーの BMP となるのは道理です。 | ||||||||
|
投稿日時: 2007-05-16 18:45
私もそこが気になって検索してみたのですが、一応フォーマットは存在する ……ような感じです。 ただ、手元にある Photoshop (だいぶバージョンが古くて 6 です)では 24bit の JPEG しか出力できませんでしたので、本当に存在するのかど うか確証が持てない状態です(THcomp かよ、とかいう話はおいといて)。 ただ、.NET Framework で出力できるかというと、たぶんできないような 気がします。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||
|
投稿日時: 2007-05-16 19:21
ちょっと説明が足りなかったかもしれません。
>PaintShopやPhotoShopの機能には、8bitグレースケールのJpgファイルを >出力する機能がありまして、 PaintShopやPhotoShopはもともと24bitカラーを扱えます。 ここで24bitカラーというのはRGBそれぞれが8bitの 濃淡情報を持つということです。(色深度といいますが) そこで、8bitグレースケールのJpgファイルを出力する機能ですが 24bitカラーから色情報を破棄して濃淡情報だけにするものです。 従ってグレースケールとしては8bitとなるわけです。 >これを利用して作成されたJpgファイルは、Bitmapクラスで読み込んだときに、>Bitmap.PixelFormatの値はFormat8bppIndexedになります。 ここで読み込まれている値は1ピクセルあたりの濃淡情報が8bitで あるということで最終的に出力されるファイルが8bitであるという 意味ではありません。(8bpp = 8bit per pixelという意味です) ご使用されているディスプレイ(多分LCDでしょう)はカラーだと思いますが、 カラーディスプレーにグレースケールを表示する場合は R=G=Bとして表示しています。 (どれか単色だけに出力すると当然グレーになりませんよね) そうするためにはファイルは8bitではなく24bitでなければなりません。 (8bitグレースケールは24bitカラーに含まれます。) カラーデータが扱える以上見た目は8bitでも中身は24bitです。 >(そもそも24bitで正解ということであれば、ここが間違いですが・・・) そういうことになります。 | ||||||||
|
投稿日時: 2007-05-16 19:23
改めて検索してみました。 JFIF 的には Number of components=1 を許容しているようですね。
出来なくても、それほど不思議なことではありませんね。 | ||||||||
|
投稿日時: 2007-05-16 19:46
私も System.Drawing / System.Drawing.Imaging ではサポートされていないに一票。
GDI+ レベルでは微妙。 .NET 3.0 の、System.Windows.Media / System.Windows.Media.Imaging 名前空間のクラスを使えば可能でした。 // でもこの辺まで System.Windows 以下にあっていいもんなんだろうか。 | ||||||||
|
投稿日時: 2007-05-16 20:15
ライブラリが実装を持っているのではなく、Windows のどれかのサブシステムのラッパでしかないようなものについては System.Windows.* 配下の方が自然な気がします。 | ||||||||
|
投稿日時: 2007-05-16 20:57
JPEG(JFIF)には、グレースケールがあります。libJpeg などの JFIF サポートエンジンではフォローされています。
が、ざっと見直した範囲とおいらの記憶では、GDI+ではサポートしていなかったはずです。 もちろん、GDI+ レベルでの話なので、独自拡張が為されていない.NET でも同様です。 なので、やるとしたら自前でグレースケールにするか、libJpeg(C++/CLIでラップ)使うか、どこかのライブラリを利用するかになるとおもいます。 _________________ // とっちゃん(高萩 俊行)@わんくま同盟 // とっちゃん’Blog // MS-MVP for Developer Tools - Visual C++ // WindowsInstallerの話題はhttp://www.freeml.com/msiまで | ||||||||
|
投稿日時: 2007-05-16 22:18
そもそもスレ主ってはじめから、出力したときにどうたらの話じゃなくて、1ピクセルのBitmap.PixelFormatの値だけをみて話してるんじゃね? つーか普通画像ファイルで8bitとか24bitとか32bitって言われたときって1ピクセルを表すデータの話だろ?1ピクセルが8bitだけどインデックスカラーで参照してるカラーテーブルがRGBそれぞれあるから24bitなんて言い方しねーよwwwwwww 要はpaintshopとかフォトショで作成できるような 「Bitmap.PixelFormatの値はFormat8bppIndexed」のjpeg画像を作る方法が知りたいんでしょ? >投稿者 横槍だけいれると他の言いたがりどもと同じだから、ひとつアドバイスすると、 グレースケール化が甘い。どこのペイント関連のアプリもそうだけど、人間の目でみて自然なグレースケールにするためには、RGBを特定の割合で調整する必要がある まずそれだな あとコード書くときはコメントいれろよな [ メッセージ編集済み 編集者: 未記入 編集日時 2007-05-16 22:19 ] |