- PR -

パレット付き画像のストリームからの取り込みについて

投稿者投稿内容
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-07-23 09:27
下記の様にしてストリームからパレット付き画像を読み込んでるのですが、
パレットのデータが取得できません。

Dim mstream As New MemoryStream(bytImageBuffer)
mstream.Flush()
Dim bmpBuffer As New Bitmap(mstream)

何か足りないのでしょうか?
他にストリームからパレット付きの画像データを取得できる方法はありますか?
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-07-23 10:26
このご投稿内容だけでは回答を得るには情報が不足していると思います。

bytImageBufferの中身はどのように作られたものですか。(本当にパレット付き画像なのでしょうか。)

bmpBuffer.Paletteを参照して何かエラーが起きたのでしょうか、それともNothingだったのでしょうか。
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-07-23 10:57
IIJIMASさん。早速のご回答ありがとうございます。
もう少し詳しくソースを載せますね。
読み込んだ画像は256色のパレットを持っています。

hStream = New System.IO.FileStream(strFname, IO.FileMode.Open)
hReader = New System.IO.BinaryReader(hStream)

Dim bytImageBuffer(ImageLength - 1) As Byte

(省略)

'↓ストリームの途中から読み取り
hReader.Read(bytImageBuffer, 0, ImageLength)

Dim mstream As New MemoryStream(bytImageBuffer)
mstream.Flush()
Dim bmpBuffer As New Bitmap(mstream)

Dim pltBuffer As System.Drawing.Imaging.ColorPalette

pltBuffer = bmpBuffer.Palette
'↑ここではエラーは起きません
'但し、↓が0になってしまいます。
'pltBuffer.Entries.Length

色情報は正しく取得できています。ただ、パレットデータが取得できません。
宜しくお願いします。
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-07-23 13:27
やはりその元のデータが「パレット付き画像」ではないのではないでしょうか。

私の手元のWindows XPのC:\WINDOWSにある画像で
>pltBuffer.Entries.Length
を試してみましたが、
たとえば、
グリーン ストーン.bmpは232
大草原の風.bmpは91
シャボン.bmpは97
となりますよ。

元の画像はどのように作成しましたか。
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-07-23 14:52
元画像はアイコンに格納されているPNG形式のものです。
ファイルのヘッダーを普通に
hReader.ReadByte
等で読み込んだ後にPNG圧縮されたアイコンの画像データを読み込もうとしています。
PNG形式のパレット情報は
bmpBuffer.Palette
には格納されないのでしょうか?
だとすれば、パレットの情報はどこから取得すればよいのでしょう。
宜しくお願いします。
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-07-23 16:03
引用:

Hideringさんの書き込み (2007-07-23 14:52) より:
PNG形式のパレット情報は
bmpBuffer.Palette
には格納されないのでしょうか?


PNG形式でもパレット情報があれば格納されると思います。

PNGファイルをバイナリエディタで開いて
PLTEチャンクの"PLTE"があるかどうか確かめてみてはどうでしょうか。
16進表示で
50 4C 54 45
となります。
なければ「パレット情報」はないということです。

参考リンク:
PNG (Portable Network Graphics) Specification
http://www.w3.org/TR/REC-png-multi.html
Hidering
常連さん
会議室デビュー日: 2007/05/22
投稿数: 33
投稿日時: 2007-07-23 16:39
IIJIMASさん詳しいご回答ありがとうございます。

早速、データを調べたところ、PLTEチャンクは存在しませんでした。

ところが、ネットでダウンロードしたフリーの画像処理ソフトで開くと
256色のパレットが確かに表示されます。
使用した画像もそのソフトで作成したものなので、
このソフトがPNG形式の画像を読み込むときは
独自の方法でパレット情報を生成していると考えて良いのでしょうか?
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-07-23 17:00
>独自の方法でパレット情報を生成していると考えて良いのでしょうか?
たぶんそうだと思います。

結局、ピクセルのデータをすべて読めば、手間はかかりますが似たようなことができると思います。

>ところが、ネットでダウンロードしたフリーの画像処理ソフトで開くと
ところでそのソフトとは何でしょうか、教えていただいてもそれがどうパレット情報を生成しているかまでわからないとは思いますが…

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