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

RGBカラーモード判定について

環境/言語:[VB.NET .NET Framework2.0]
分類:[ASP.NET]

お世話になります。

【質問内容】
ASP.NETでFileUploadコントロールを使用し、指定された画像ファイルを
バイナリデータに変換し、データベースに格納しております。
格納するファイルはRGBカラーモードのファイルのみにしたい為、
指定された画像ファイルがRGBカラーモードのファイルかを判断したいです。
できればソースコード側(aspx.vb)で判定を行いたいです。

どなたかご教示頂きたく思います。
■No30629に返信(もやしノッポさんの記事)
> ASP.NETでFileUploadコントロールを使用し、指定された画像ファイルを
> バイナリデータに変換し、データベースに格納しております。
> 格納するファイルはRGBカラーモードのファイルのみにしたい為、
> 指定された画像ファイルがRGBカラーモードのファイルかを判断したいです。
> できればソースコード側(aspx.vb)で判定を行いたいです。

簡易な方法として Image のインスタンスから PixelFormat プロパティを見て判断するとか。
■No30629に返信(もやしノッポさんの記事)

変換したバイナリデータの画像情報の部分を解析して判断するとか。
許容する画像ファイルというのがどんな形式のファイルなのか決めておく必要があると思います。
じゃんぬねっと様

ご回答ありがとうございました。

>簡易な方法として Image のインスタンスから PixelFormat プロパティを見て判断するとか。

Dim bmp As New Bitmap("C:\bitmapBase.gif")
bmp.PixelFormatで判断すると言うことでよろしいでしょうか?
RGBカラーモードに該当する列挙型は、どれにあたるのでしょうか?
shu様

ご回答ありがとうございました。

>変換したバイナリデータの画像情報の部分を解析して判断するとか。
>許容する画像ファイルというのがどんな形式のファイルなのか決めておく必要があると思います。
⇒変換したバイナリデータをどのように判断すればよろしいのでしょうか?
■No30635に返信(もやしノッポさんの記事)

> >変換したバイナリデータの画像情報の部分を解析して判断するとか。
> >許容する画像ファイルというのがどんな形式のファイルなのか決めておく必要があると思います。
> ⇒変換したバイナリデータをどのように判断すればよろしいのでしょうか?
どのようにバイナリデータとして持っているかということに依存すると思うのですが、byte配列として処理できると思いますので、扱いたいファイルの形式を確定して各ファイル形式にあった解析をされるとよいと思います。『RGBカラーモード』ってどう判断するのということをファイル形式毎に調べる必要があります。ファイル形式によっては.Net用ライブラリが用意されていてチェック出来るかもしれませんが、別の形式によっては出来ないかもしれません。そもそも画像ファイルという判断をどのように行うのかということも決める必要があります。
例えば、ここのアップ用ファイルに使用出来るものは /.gif/.jpg/.png/.zipと記述があります。(zipは画像ではないですが)
ところで、RGBカラーモードとありますが、逆に、RGBカラーモード以外の画像ファイルとは、具体的にはどのようなものがあるのでしょうか?
■No30634に返信(もやしノッポさんの記事)
> Dim bmp As New Bitmap("C:\bitmapBase.gif")
> bmp.PixelFormatで判断すると言うことでよろしいでしょうか?
> RGBカラーモードに該当する列挙型は、どれにあたるのでしょうか?

どのような画像形式を想定しているのかが 一切 書かれていないので、
具体的なコードを求められたところで、回答側としても答えようが
無いのですが、恐らくはRGBカラーの画像と、CMYKカラーの画像を
区別したいのではないかと予想してみました。


そこで、とりあえず JPEG の RGB/CMYK の違いと仮定し、
http://blog.dicecream.net/2009/09/iecmyk.php
にあるサンプルを使って試してみました。

テスト環境は Windows 7 Enterprise SP1 + .NET 2.0 SP2 です。


Dim rgb As New Bitmap("C:\temp\img\090916-rgb.jpg")
Dim ymck As New Bitmap("C:\temp\img\090916-cmyk.jpg")


上記の場合、rgb.PixelFormat は &H21808 (Format24bppRgb) を返し、
ymck.PixelFormat は &H200F を返しました。

この &H200F という値は、.NET の PixelFormat 列挙体としては
定義されていませんが、その元となる GDI+ API においては、
PixelFormat32bppCMYK と定義されている値です。

≪GdiPlusPixelFormats.h≫
#define    PixelFormatGDI          0x00020000 // Is a GDI-supported format
#define    PixelFormat24bppRGB        (8 | (24 << 8) | PixelFormatGDI)
#define    PixelFormat32bppCMYK       (15 | (32 << 8))



しかしながら、この結果は OS によって左右されることになります。

今回は ASP.NET のようなので、同じコードをサーバーOS で試してみたところ、
Server2008R2 Std.では、Win7 同様に &H200F(Format32bppCmyk 相当)が返され、
Server2003R2 Sta.では、RGB/YMCK ともに Format24bppRgb が返されました。


>>> 格納するファイルはRGBカラーモードのファイルのみにしたい為、
見方を変えれば、古い実行環境であれば、勝手に RGB 化されて
読み込まれるということが言えそうです。

もっとも、RGB ファイルに変換すれば格納してもよいのか、それとも
元が YMCK ファイルだったら弾きたいのかは分かりませんけれど…。

この他、JPEG ではなく、epsバイナリ、eps ASCII、eps ASCII85 などの
可能性もありますが、元の質問内容が曖昧なので具体的な話は避けておきます。
魔界の仮面弁士様

ご回答ありがとうございます。

> どのような画像形式を想定しているのかが 一切 書かれていないので、
> 具体的なコードを求められたところで、回答側としても答えようが
> 無いのですが、恐らくはRGBカラーの画像と、CMYKカラーの画像を
> 区別したいのではないかと予想してみました。
⇒画像形式は、.jpg(JPEG)です。
 RGBカラーモードの画像は、ある程度のブラウザで表示できますが
 それ以外(CMYKカラーの画像等)は、ブラウザ環境によって表示できない場合があるそうなので、RGBカラーモード以外の画像が指定された場合は、
 変換するのではなく、エラーメッセージを表示し、弾きたいと考えております。

> しかしながら、この結果は OS によって左右されることになります。
>
> 今回は ASP.NET のようなので、同じコードをサーバーOS で試してみたところ、
> Server2008R2 Std.では、Win7 同様に &H200F(Format32bppCmyk 相当)が返され、
> Server2003R2 Sta.では、RGB/YMCK ともに Format24bppRgb が返されました。
⇒WEBサーバーの環境ですが、複数サーバー使用していまして
 環境がWindowsServer2003とWindowsServer2008が存在します。
 どちらのサーバーでも問題なくチェックすることは難しいのでしょうか?

> もっとも、RGB ファイルに変換すれば格納してもよいのか、それとも
> 元が YMCK ファイルだったら弾きたいのかは分かりませんけれど…。
⇒RGBカラーモード以外のファイルは、弾きたいと考えております。
 ちなみにRGBカラーモード以外のファイルをカラーモードを判断せずに
 RGBカラーモードの画像ファイルに変換することは可能なのでしょうか?

以上、お手数ですがご教授願います。
もし、CMYKカラーの画像がアップロードされた場合でも、RGBカラーの画像に変換することによって受け入れ可とするならば、
例えば元画像のBitmapのクローンをPixelFormatを24bppRGBで作成し、これを保存するなどして、無条件でRGBカラーに変換するというのはどうでしょう。
そうすれば、カラーモードについてチェックする必要もなく、魔界仮面さんご指摘のOS依存も気にする必要はないと思います。

Bitmap.Cloneメソッド
http://msdn.microsoft.com/ja-jp/library/ezs7679t.aspx
アナン様

ご回答ありがとうございます。

RGBカラーモード以外の全ての画像で対応可能と言う認識でよろしいのでしょうか?

できれば今回は、変換するのではなくチェックをしたいです。
■No30646に返信(もやしノッポさんの記事)

http://hayatomo.com/2010/08/10/559
http://terralib.dpi.inpe.br/lib/html/devel/html/dd/d5c/a02985.html
http://www14.ocn.ne.jp/~setsuki/ext/jpg.htm

この辺の情報からするとSOFセグメントの中にカラーの種類情報が入っているようなのでそこを参照するようにするとよいのではないでしょうか?
■No30647に返信(shuさんの記事)
> ■No30646に返信(もやしノッポさんの記事)
>
> http://hayatomo.com/2010/08/10/559
> http://terralib.dpi.inpe.br/lib/html/devel/html/dd/d5c/a02985.html
> http://www14.ocn.ne.jp/~setsuki/ext/jpg.htm
>
> この辺の情報からするとSOFセグメントの中にカラーの種類情報が入っているようなのでそこを参照するようにするとよいのではないでしょうか?
>
shu様

ご回答ありがとうございました。

>>http://hayatomo.com/2010/08/10/559
>>http://terralib.dpi.inpe.br/lib/html/devel/html/dd/d5c/a02985.html
>>http://www14.ocn.ne.jp/~setsuki/ext/jpg.htm
⇒できればASP.NET(VB)のサンプルは無いでしょうか?

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