- PR -

C#での8bitグレースケールJpegの作成方法

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-16 18:36
引用:

Jpegについて、BMPのときの最後のoutput.Saveメソッドの第二引数で作成する
画像フォーマットの種類が指定できるため、ここにJpgを指定してみたのですが、
見た目はグレースケールなのですが24bitのものになってしまいます。



素朴な疑問なんですが、「自然画」を扱うために定められた画像フォーマットである JPEG に「8bit グレースケール」なんて保存モードがあるんでしょうか?

JPEG フォーマットが 24bit カラー前提の画像フォーマットであるなら、JPEG 形式で保存したものを素直に読み込めば 24bit カラーの BMP となるのは道理です。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-05-16 18:45
引用:

渋木宏明(ひどり)さんの書き込み (2007-05-16 18:36) より:

素朴な疑問なんですが、「自然画」を扱うために定められた画像フォーマットである JPEG に「8bit グレースケール」なんて保存モードがあるんでしょうか?


私もそこが気になって検索してみたのですが、一応フォーマットは存在する
……ような感じです。
ただ、手元にある Photoshop (だいぶバージョンが古くて 6 です)では
24bit の JPEG しか出力できませんでしたので、本当に存在するのかど
うか確証が持てない状態です(THcomp かよ、とかいう話はおいといて)。

ただ、.NET Framework で出力できるかというと、たぶんできないような
気がします。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
seai
ベテラン
会議室デビュー日: 2007/04/10
投稿数: 60
投稿日時: 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で正解ということであれば、ここが間違いですが・・・)

そういうことになります。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-16 19:23
引用:

私もそこが気になって検索してみたのですが、一応フォーマットは存在する
……ような感じです。



改めて検索してみました。
JFIF 的には Number of components=1 を許容しているようですね。

引用:

ただ、.NET Framework で出力できるかというと、たぶんできないような
気がします。



出来なくても、それほど不思議なことではありませんね。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-05-16 19:46
私も System.Drawing / System.Drawing.Imaging ではサポートされていないに一票。
GDI+ レベルでは微妙。

.NET 3.0 の、System.Windows.Media / System.Windows.Media.Imaging 名前空間のクラスを使えば可能でした。
// でもこの辺まで System.Windows 以下にあっていいもんなんだろうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-05-16 20:15
引用:

// でもこの辺まで System.Windows 以下にあっていいもんなんだろうか。



ライブラリが実装を持っているのではなく、Windows のどれかのサブシステムのラッパでしかないようなものについては System.Windows.* 配下の方が自然な気がします。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 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
投稿数: 3
投稿日時: 2007-05-16 22:18
引用:

ここで読み込まれている値は1ピクセルあたりの濃淡情報が8bitで
あるということで最終的に出力されるファイルが8bitであるという
意味ではありません。

>(そもそも24bitで正解ということであれば、ここが間違いですが・・・)
そういうことになります。



そもそもスレ主ってはじめから、出力したときにどうたらの話じゃなくて、1ピクセルのBitmap.PixelFormatの値だけをみて話してるんじゃね?

つーか普通画像ファイルで8bitとか24bitとか32bitって言われたときって1ピクセルを表すデータの話だろ?1ピクセルが8bitだけどインデックスカラーで参照してるカラーテーブルがRGBそれぞれあるから24bitなんて言い方しねーよwwwwwww

要はpaintshopとかフォトショで作成できるような
「Bitmap.PixelFormatの値はFormat8bppIndexed」のjpeg画像を作る方法が知りたいんでしょ?


>投稿者
横槍だけいれると他の言いたがりどもと同じだから、ひとつアドバイスすると、
グレースケール化が甘い。どこのペイント関連のアプリもそうだけど、人間の目でみて自然なグレースケールにするためには、RGBを特定の割合で調整する必要がある
まずそれだな あとコード書くときはコメントいれろよな

[ メッセージ編集済み 編集者: 未記入 編集日時 2007-05-16 22:19 ]

スキルアップ/キャリアアップ(JOB@IT)