FineViewでの対応
Paint Shop Pro ver5〜7 に対応。
ver5のコンポジット画像は未対応。→ 1stレイヤー(背景)を表示
FilterGearでの対応
Paint Shop Pro ver5〜X3 に対応。
PSPのデコーダーは、レイヤーレベルでデコードができるように作ってあります。
(ラスターレイヤーのみ。)
FineViewでは、レイヤーレベルのデコードを予定していません。
Macromedia社が開発した画像編集ソフトFireworksの画像形式。
オリジナルのPNGをベースに独自のチャンクを追加した構造だと思いますが・・詳細は不明。
(2005年MacromediaはAdobe Systemsに買収された。)
FineViewでの対応
未対応。
Aldus社が開発した高い柔軟性をもつ画像形式。(1994年AldusはAdobe Systemsと合併。)
TIFF 6.0 Specification ( Adobe Systems )
TIFF6の仕様書です。
121ページもあります。ページ数からもTIFF形式の複雑さを窺い知ることができます。
□□ TIFFヘッダー □□
TIFFヘッダーは8バイト固定
type
TTIFFHeader = record
// バイトオーダー
// 'MM'のときビッグエンディアン (Motorola Motorola)
// 'II'のときリトルエンディアン (Intel Intel)
ByteOrder: WORD; // 'MM' or 'II'
// バージョン
Version: WORD; // 0x2A(42) ←常に42
// IFD (ImageFileDirectory) へのポインタ
IFDPointer: Cardinal; //
end;
□□ IFD □□
IFDには符号化された画像の様々な情報が格納されています。Exifと非常によく似ています。
IFDの構成
IFDエントリーの数 // 2バイト
IFDエントリー // 12バイト固定のデータ
・
・
IFDエントリー // 12バイト固定のデータ
次の画像へのIFDポインタ // 4バイト(画像が一つだけのときは0)
□ IFDエントリー □
type
TIFDEntry = record
Tag: WORD; // タグ。どういったデータが入っているかを示す識別子
DataType: WORD;
Count: Cardinal;
Data: Cardinal; // データ or 実データへのポインタ
end;
IFDエントリーではタグごとに扱う情報が異なります。
基本的なタグのみ抜粋(タグは無数に存在します。公開タグ:0xFE〜0x214。非公開タグも存在。)
0x100: ImageWidth // 画像の幅
0x101: ImageLength // 画像の高さ
0x102: BitsPerSample // 色深度
0x103: Compression // 符号化方法
0x111: StripOffsets // 画像データへのポインタ
0x115: SamplesPerPixel // カラープレーン数
0x117: StripByteCounts // 画像データサイズ
0x140: ColorMap // パレットデータへのポインタ
0x106: PhotometricInterpretation // 画像識別コード
0x103: Compression(符号化方法)
1: 圧縮なし
2: CCITT Group 3 変形ハフマンRLE
3: CCITT Group 3 Fax
4: CCITT Group 4 Fax
5: LZW
6,7: JPEG
32773: PackBits
etc
0x106: PhotometricInterpretation(画像識別コード)
0,1: モノクロ or グレイスケール(パレットの構築 0:最小値白, 1:最小値黒)
2: RGBカラー
3: パレットカラー
etc
0x140: ColorMap
パレットデータは1バイトではなく2バイト(0〜65535)で与えられます。
8bitパレットカラー(256カラー)のとき256*3(RGB)*2=1536バイト分のデータが存在します。
パレットのデータはRGB順と記されていますが、これは RGBRGBRGB...ということではなく
はじめにRのパレットデータ全てが存在し、次にGのパレットデータがというように並んでいます。
※ ColorMapに関する情報は調べた画像に対するものであって、必ずしもここで紹介したとおりとは限りません。
|
符号化方法の選択肢が多いことがデコーダーの開発を難しくしています。
ひとつの符号化に限っても仕様の異なるものが複数存在し、開発者泣かせの画像形式と言えます。
(JPEGで符号化されたTIFFで仕様の異なるものを3種類確認しています。)
FineViewでの対応
IFDを解析し、LibTiffでデコードできる形式はLibTiffで、
そうでない形式は独自デコーダーでデコードしています。
一部対応していない色深度がありますが、一般に広く使われているTIFF形式に関してはサポートしています。
独自デコーダーでは、Compression=6で符号化されたTIFF形式をデコードしています。
補足)TIFFのライブラリーであるLibTiffは全てのTIFF形式をサポートしているわけではありません。
→ http://www.asmail.be/msg0055440587.html
SGIファイル形式 (.RGB/.RGBA/.SGI) |
---|
シリコングラフィクスのマシンで使われているファイル形式。
バイトオーダーがビッグエンディアンなのでWindowsでプログラミングするときはスワップ処理が必要。
SGIのファイル形式は無圧縮(生データ)かランレングスでエンコードされたデータのどちらかです。
rgb.txt(英文)
全体的な構成
VERBATIM(生データ) |
RLE |
---|
ヘッダ | ヘッダ |
画像データ | オフセットテーブル |
| 画像データ |
SGIのヘッダ
ヘッダの構成は、以下のようになっています。
Size | Type | Name | Description
2 bytes | short | MAGIC | IRIS image file magic number
1 byte | char | STORAGE | Storage format
1 byte | char | BPC | Number of bytes per pixel channel
2 bytes | ushort | DIMENSION | Number of dimensions
2 bytes | ushort | XSIZE | X size in pixels
2 bytes | ushort | YSIZE | Y size in pixels
2 bytes | ushort | ZSIZE | Number of channels
4 bytes | long | PIXMIN | Minimum pixel value
4 bytes | long | PIXMAX | Maximum pixel value
4 bytes | char | DUMMY | Ignored
80 bytes | char | IMAGENAME | Image name
4 bytes | long | COLORMAP | Colormap ID
404 bytes | char | DUMMY | Ignored
MAGIC
SGI形式のシグネチャです。474(10進数)が格納されています。
STORAGE
この値は0か1のいずれかです。ランレングスでエンコードされてるときは、1となります。
BPC
この値が1のときは、R/G/Bそれぞれ1バイト(256レベル)として扱います。
2のときは2バイトで扱います。
この値は1と2のいずれかです。
DIMENSION
この値は1,2,3のいずれかです。
1のとき1行のラインを示します。2のときWidthxHeightの単一のチャネルを持ちます。
3のときWidthxHeightで、複数のチャネルを持ちます。
チャネル数はZSIZEで与えられる数値です。
XSIZE
画像の横幅(Width or COLS)です。
YSIZE
画像の縦幅(Height or ROWS)です。
ZSIZE
画像のチャネル数です。
IMAGENAME
79キャラクタ+NULLです。
COLORMAP
ピクセルをどうのようにデコードするかを示します。
0から3のいずれかの値を持ちます。
0: NORMAL
SGIファイル形式の多くはこのタイプです。
B/Wは1チャネルで扱います。RGBは3チャネル、RGBAは4チャネルで扱います。
1: DITHRED
このファイル形式は既に陳腐化したものです。
1チャネルで画像を構成します。
RGBのデータは、8bitの中に収められています。
赤:bits[2..0], 緑:bits[5..3], 青:bits[7..6]
2: SCREEN
このファイル形式は既に陳腐化したものです。
インデックスカラーを使用して画像を展開します。
1チャネルで画像を構成します。
3: COLORMAP
SGIマシンのカラーマップを使用して画像を表示する方法です。
|
画像のデコード(RLE版)
※RLEでない画像データは省略
RLEで圧縮されてる場合、RLEのオフセットテーブルが与えられます。
オフセットテーブルには、画像データへのポインタとそのデータレングスが格納されています。
オフセットデータのテーブル情報
Size | Type | Name | Description
tablen longs | long | STARTTAB | Start table
tablen longs | long | LENGTHTAB | Length table
オフセットテーブルを取得(IDE:C++Builder)
typedef struct {
unsigned long *Start;
unsigned long *Size;
} TOffsetTable;
TOffsetTable *offTable = new TOffsetTable;
// オフセットデータ取得
int tablen = SGIHeader.YSize*SGIHeader.ZSize;
offTable->Start = new unsigned long[tablen];
offTable->Size = new unsigned long[tablen];
TFileStream *fs = new TFileStream(FileName,fmOpenRead);
fs->Seek(512, soFromBeginning);
fs->Read(offTable->Start, tablen*sizeof(long));
fs->Read(offTable->Size, tablen*sizeof(long));
delete fs;
// ※オフセットデータを使い終わったらフリー
スキャンラインへのアクセス方法
unsigned long rleoffset, rlelength;
rleoffset = image->rowStart[y+z*bmp->Height];
rlelength = image->rowSize[y+z*bmp->Height];
// RLE情報の場所へ
TFileStream *fs = new TFileStream(FileName,fmOpenRead);
fs->Seek(rleoffset, soFromBeginning);
// ※yはスキャンするライン、zはスキャンするチャネル
// ※Windows系ではオフセットデータを予めスワップする必要があります。
|
補足
COLORMAPは4タイプあります。Windows環境でサポートできるものは3つです。
内2つは、現在使われていない形式です。
COLORMAP種別 | 対応 |
NORMAL | ○ |
DITHRED | ×(obsolete) |
SCREEN | ×(obsolete) |
COLORMAP | ×(SGI マシン) |
メモ
・ビッグエンディアン
・RGB24bit, グレイスケール, RGB with Alpha, グレイスケール with Alpha が存在
・各チャネルは、8 or 16ビット
・RAWデータのプレーン順: RGB, RGBA順
(RLEデータのオフセットテーブルもRGBA順。画像データのメモリ順は任意。)
・他形式と違い、任意のプレーン、任意のラインからデコード可能
・RLE展開データは、ラインを跨がないことが約束されている
・ボトムスキャン
・ヘッダ情報512バイト固定(内ダミー404バイト)
FineViewでの対応
デコード、エンコードともに対応。(但し、グレイスケール with Alpha には未対応。)
FilterGearでの対応
グレイスケール with Alpha に対応。グレイスケールのデコードバグ修正。
TGAファイル形式 (.TGA/.VST/.ICB/.VDA) |
---|
RLEを用いた画像形式。
デコードの資料(簡易テキスト文書)
tga.txt
PDF文書による詳説
Truevision TGA FILE FORMAT SPECIFICATION Version 2.0
targa.pdf
メモ
・RLE展開データは、ラインを跨ぐことがある
RLEを用いた画像形式。
特徴など・・
・リトルエンディアン
・ヘッダ情報128バイト固定
・制御ビットが上位2ビット
・リテラルデータがブロックされてない。
・画像データはラインごとにRプレーンGプレーンBプレーンの順で格納されている。
・ファイルのケツのマイナス769byte目が0xCのときは、256パレット。次いでパレットデータが格納されている。
デコードの資料(簡易テキスト文書)
pcx.txt
コード付き。
1つのファイルに5つの解像度の画像情報を保持します。
pcd.rtf(英語)
(Pascalのソース付き。)
Kodak PhotoYCC colour space for PhotoCD images
圧縮を用いない画像形式。学術用途などで広く使われている。
PPM: Portable PixMap (24bit color)
PGM: Portable GrayMap (8bit grayscale)
PBM: Portable BitMap (1bit monochrome)
これら3つを総称して、PNM (Portable aNyMap) と呼ばれる。
マジックナンバー (P1〜P6)
P1: PBM (ASCII)
P2: PGM (ASCII)
P3: PPM (ASCII)
P4: PBM (BINARY)
P5: PGM (BINARY)
P6: PPM (BINARY)
ホワイトスペース (blanks, TABs, CRs, LFs)
$20, $09, $0D, $0A
(Carriage Return / 行頭復帰、Line Feed / 改行)
画像データ
PPM, PGM
マジックナンバー + WS + 幅 + WS + 高さ + WS + 輝度 + WS + 画素データ
PBM
マジックナンバー + WS + 幅 + WS + 高さ + WS + 画素データ
(WSはホワイトスペース)
ノート
BINARY(RAWBITS)のときのホワイトスペースの数に注意!!
PPM,PGM: 輝度の後のホワイトスペースは1バイトのみ許される。
PBM: 高さの後のホワイトスペースは1バイトのみ許される。
デコードのテスト用に作成した画像(画素値が$20といったホワイトスペースの値のみで構成されたPGM)
黒い10x10の画像をデコードできればOK。
p5_pix_digit_all_whitespace.zip
FineViewでの対応
デコードはP1〜P6の全てに対応。エンコードは全てバイナリー出力P4〜P6。
IFF(ILBM)ファイル形式 (.IFF/.LBM) |
---|
コモドール社製のAMIGAというコンピュータで使われていた画像形式。
AMIGAは、モトローラ社製のCPU(68000)を使用してるためビッグエンディアン。
IFFという名前は、チャンク構造を意味しているようなので、インターリーブビットマップ呼んだほうが
適切かもしれません。
輝度の低いデータから順に格納されるという独特の画像形式です。LightWaveでも使用されてます。
(LightWaveは、AMIGA出身のソフトウェア。)
チャンク構造
最初の4バイトはチャンクID、続く4バイトはチャンクサイズ、そしてチャンクサイズ分のチャンクデータ。
チャンクサイズは、チャンクID部とチャンクサイズ部のサイズを含みません。
IFFのチャンクは入れ子にすることができます。
typedef struct {
unsigned long ckID;
unsigned long ckSize;
unsigned char ckData[n]; // nは、ckSize
} TChunk;
BMHDチャンク
画像サイズや、コンプレッションの情報が格納されています。
// (インターリーブ)ビットマップヘッダ構造
typedef struct {
unsigned long ID;
unsigned long Size;
unsigned short Width;
unsigned short Height;
unsigned short Xorg;
unsigned short Yorg;
unsigned char Planes;
unsigned char Masking;
unsigned char Compression;
unsigned char Pad;
unsigned short Trclr;
unsigned char AspectX;
unsigned char AspectY;
unsigned short pWidth;
unsigned short pHeight;
} TILBMHeader;
CMAPチャンク
カラーマップのチャンクです。
typedef struct {
unsigned char red, green, blue; // R/G/Bの輝度情報(0..255)
} ColorRegister;
typedef ColorRegister ColorMap[n]; // size = 3 x n bytes
BODYチャンク
画像データが格納されているチャンクです。BMHDのCompressionが1のとき画像データはRLEでエンコードされています。
nプレーンを持つIFF/ILBM形式で、1stプレーンには各rowの最下位ビットが2ndプレーンには
次のビットが・・・といったように配列で格納されてます。
|
ラスタイメージの展開(24bppの場合)
画像データは、横1ライン分ごとにRed成分、Green成分、Blue成分の順に並んでいます。
Red成分は、0bit目の情報全て、次いで1bit目の情報全てといったように輝度の低い順で並んでいます。
Green成分、Blue成分も同様です。
Red Plane |
r00 r01 r02 ... | r10 r11 r12 ... |
r20 r21 r22 ... | r30 r31 r32 ... |
r40 r41 r42 ... | r50 r51 r52 ... |
r60 r61 r62 ... | r70 r71 r72 ... |
Green Plane |
g00 g01 g02 ... | g10 g11 g12 ... |
g20 g21 g22 ... | g30 g31 g32 ... |
g40 g41 g42 ... | g50 g51 g52 ... |
g60 g61 g62 ... | g70 g71 g72 ... |
Blue Plane |
b00 b01 b02 ... | b10 b11 b12 ... |
b20 b21 b22 ... | b30 b31 b32 ... |
b40 b41 b42 ... | b50 b51 b52 ... |
b60 b61 b62 ... | b70 b71 b72 ... |
各プレーンのバイト数は、(w+15)/16 wordsなので、((w+15)/16)*2 Bytesとなります。
Red成分の0bit目の情報
Red成分の1bit目の情報
Red成分の2bit目の情報
Red成分の3bit目の情報
Red成分の4bit目の情報
Red成分の5bit目の情報
Red成分の6bit目の情報
Red成分の7bit目の情報
Green成分の0bit目の情報
Green成分の1bit目の情報
・
・
・
・
Blue成分の7bit目の情報
Redプレーンの展開のサンプル
Red Plane |
r00 r01 r02 ... | r10 r11 r12 ... |
r20 r21 r22 ... | r30 r31 r32 ... |
r40 r41 r42 ... | r50 r51 r52 ... |
r60 r61 r62 ... | r70 r71 r72 ... |
R00 & 0x80 -> row[2] |= 00000001
R10 & 0x80 -> row[2] |= 00000010
R20 & 0x80 -> row[2] |= 00000100
R30 & 0x80 -> row[2] |= 00001000
R40 & 0x80 -> row[2] |= 00010000
R50 & 0x80 -> row[2] |= 00100000
R60 & 0x80 -> row[2] |= 01000000
R70 & 0x80 -> row[2] |= 10000000
R00 & 0x40 -> row[5] |= 00000001
R10 & 0x40 -> row[5] |= 00000010
R20 & 0x40 -> row[5] |= 00000100
R30 & 0x40 -> row[5] |= 00001000
R40 & 0x40 -> row[5] |= 00010000
R50 & 0x40 -> row[5] |= 00100000
R60 & 0x40 -> row[5] |= 01000000
R70 & 0x40 -> row[5] |= 10000000
※ 左の式が真のとき、ビットを立てていきます。
※ unsigned char *row = (unsigned char *)Bitmap->ScanLine[0];
|
ラスタイメージの展開(4bppの場合)
buf[]にはRLEを展開したデータが入ってるものとします。row[]は出力先です。
buf[]に1stプレーンのデータを取得したときのデコード
buf[0] & 1000 0000 (0x80) -> row[0] |= 00010000
buf[0] & 0100 0000 (0x40) -> row[0] |= 00000001
buf[0] & 0010 0000 (0x20) -> row[1] |= 00010000
buf[0] & 0001 0000 (0x10) -> row[1] |= 00000001
buf[0] & 0000 1000 (0x08) -> row[2] |= 00010000
buf[0] & 0000 0100 (0x04) -> row[2] |= 00000001
buf[0] & 0000 0010 (0x02) -> row[3] |= 00010000
buf[0] & 0000 0001 (0x01) -> row[3] |= 00000001
buf[1] & 1000 0000 (0x80) -> row[4] |= 00010000
buf[1] & 0100 0000 (0x40) -> row[4] |= 00000001
buf[]に2ndプレーンのデータを取得したときのデコード
buf[0] & 1000 0000 (0x80) -> row[0] |= 00100000
buf[0] & 0100 0000 (0x40) -> row[0] |= 00000010
buf[0] & 0010 0000 (0x20) -> row[1] |= 00100000
buf[0] & 0001 0000 (0x10) -> row[1] |= 00000010
buf[0] & 0000 1000 (0x08) -> row[2] |= 00100000
buf[0] & 0000 0100 (0x04) -> row[2] |= 00000010
buf[0] & 0000 0010 (0x02) -> row[3] |= 00100000
buf[0] & 0000 0001 (0x01) -> row[3] |= 00000010
buf[1] & 1000 0000 (0x80) -> row[4] |= 00100000
buf[1] & 0100 0000 (0x40) -> row[4] |= 00000010
※ 左の式が真のとき、ビットを立てていきます。
1stプレーン:横1ラインの0bit目の情報(最下位ビット)
2ndプレーン:横1ラインの1bit目の情報
3rdプレーン:横1ラインの2bit目の情報
4thプレーン:横1ラインの3bit目の情報
※Bit0を最下位ビット(bit[7..0])
参考:buf[0]が、仮に0xFF(1111 1111)のとき次のようにデコードする。
row[0] = 0001 0001
row[1] = 0001 0001
row[2] = 0001 0001
row[3] = 0001 0001
|
参考リンク
iff.txt(英文)
dstormと、NEWTEKのサイトによるILBMの解説
"ILBM" IFF Interleaved Bitmap(インターリーブ・ビットマップ)
"ILBM" IFF Interleaved Bitmap
ilbm.txt(Jerry Morrison氏によるILBMのテキスト文書) (入手先wotsit)
Intro to IFF Amiga ILBM(dc.eeより入手のテキスト文書/iffspecs.lzhの中の文書) (入手先dc.ee)
確認用の画像ファイルはCommodore 65から入手できます。
FineViewでの対応
デコードのみ対応。
スキルが未熟なときに作ったものなので、デコード処理が遅いです。
JPEG, PNG, GIFといった画像形式はホームページでも良く使われる形式です。
JPEGは自然画像、PNGやGIFはセル画や図形、文字を含んだ画像に適しています。
リンク: WEB画像について
JPEGファイル形式 (.JPEG/.JPG/.JPE) Joint Photographic Experts Group |
---|
非可逆圧縮の画像形式。
人間が鈍感な「色差成分」と「高周波成分」を切り捨てることにより高い圧縮率を実現。
ホームページ、デジカメなど広く使われている。
ブロックノイズ。モスキートノイズといったデメリットもあり。
JPEG関連のリンク
JPEGのホームページ
JPEGに関するFAQ
JPEG - Wikipedia
ライブラリIJG関連のリンク
IJGのホームぺージ
ソースとドキュメントが置いてあるとこ
JPEG(CMYK)のテスト用画像
(IE6では表示できないのでダウンロードしてから試してみてください。)
IJGをパスカルで実装したもの(作者:Nomssiさん)
PasJPEG
FineViewでの対応
JPEGを表示するプログラムの多くは、IJGというライブラリを使用しています。
C++Builderで開発していたころは、IJGのライブラリを使用していましたが、
現在はPasJpegに少しだけ手を加えたものを使っています。
IJG以外では、インテルが作ったIJLというライブラリがあります。
FineViewはこちらを使用したデコードにも対応しています。
(現在IJLはインテルの別ライブラリに吸収され、単体では配布されていません。)
Exif
EXIF.org
Exif file format
Martin Djernaes Web / Jpeg Info
TIFF Tag Reference, EXIF Tags
PNGファイル形式 (.PNG) Portable Network Graphics |
---|
GIF形式の特許が問題となるなか、その代替として登場した画像形式。可逆形式の最有力。
非可逆形式ではないので文字や細かい線を含む画像にも適しています。
| ホームページ | 256カラー | フルカラー | 透過色 | αチャネル | アニメーション |
PNG | ○ | ○ | ○ | ○ | ○ | × |
GIF | ○ | ○ | × | ○ | × | ○ |
JPEG | ○ | × | ○ | × | × | × |
PNG,libpngに関する情報
PNG Home Site (PNGの公式ホームページ)
PNG Specification, Version 1.2 (ドキュメント)
libpng Home Page (libpng)
Test Suite of PNG Icons (テスト画像を入手できるとこ)
GLDPNGの開発者、tarquinさんのホームページ(開発終了?)
Delphiで使えるその他のPNGライブラリ
いろいろ
lpng-px
PNGライブラリで必要となるZLIBのホームページ(Paint Shop Proでも必用です。)
zlib Home Site
Delphiで使えるZLIB
delphi zlib
FineViewでの対応
0.53まではlibpngを。0.55からGLDPNGを使わせてもらってます。
JPEGやPNGと同様ホームページで使うことのできる画像形式。
アニメーションGIFといった他の画像形式にはない特徴も。
特許問題になったことでも有名。
デコード、エンコードにはLZWというUnisys社の特許技術が使用されてます。
HIROPONさんのホームページでは、GIFの特許問題についてわかりやすく書かれています。
ViXでは、ユニシス特許に抵触しないGIF画像のデコードを使って
いるようです。
仕様書
http://www.w3.org/Graphics/GIF/spec-gif87.txt
FineViewでの対応
Anders MelanderさんのTGIFImage(v2.2)を使用してGIFの符号化/復号化を実現しています。
TGIFImage for Delphi | MelanderBlog
このコンポーネントは、Delphi 2007から標準のコンポーネントとして正式に採用されています。
Googleが2010年に発表した、非可逆圧縮の画像形式。
同じ非可逆圧縮のJPEG形式より40%ほどファイルサイズを小さくできるといわれている。
画像品質についてのGoogleの資料:
Gallery
WebP Home
Chromium Blog: WebP. a new image format for the Web
メモ:
・VP8ベース(WebMベースではない。)
・エンディアン: リトルエンディアン
・コンテナ: RIFF
・JPEG同様、0〜100で品質を指定可能
日本人の作者によって作成され国内で広く使われていた画像形式。MAG/PI/PIC/PIC2/Q0などがあります。
お絵かきソフト「まるちぺいんと」で使われていた画像形式。
MAG形式の生みの親、Woody-Rinnさんのホームページ
TMAGImageの開発者、masさんのホームページ
TMAGImageは、DelphiでMAGを実装するためのコンポーネントです。Delphian Worldからも入手できます。
Cベースの開発環境で簡単に実装するには、道上氏によるM2BCがあります。
FineViewでの対応
対応済み。v0.53までは、道上さんのM2BC ver1.07を使用させて頂きました。
Delphiへの移植にともないv.55から、masさんのTMAGImageを使用させて頂いています。
ここでのPICは、やなぎさわさん作のPIC形式です。以前、DoGAでも使われていました。
PICの仕様書
Piの仕様書
試しに作ってみたPIC用デコーダ。デコード時に稲妻が走ります。
FineViewでの対応
PIC形式には対応済み。Pi形式は未対応。
Entis氏による画像形式。MAGやPICと比べて新しい画像形式です。
FineViewでの対応
開発環境の移行にともない未対応に。
ERIファイルを表示するときは、Susieプラグインを使用してください。
マイクロソフトがWindows用に開発した画像形式。ビットマップ(BMP)、アイコン(ICO)、カーソル(CUR)、
ウィンドウズメタファイル(WMF)の4つ。
Microsoft Windows Icon (.ICO) |
---|
異なるサイズ、異なる色深度の画像を複数持つことができる画像形式。
Vista から PNG形式の画像も内包できるように。
□ どういった場面でどのサイズのアイコンが使われるか?っといった調査
| XP | Vista | 7 |
特大アイコン | - | 256x256 | 256x256 |
大アイコン | - | 64x64(?) | 64x64(?) |
中アイコン | - | 48x48 | 48x48 |
小アイコン | - | 16x16 | 16x16 |
アイコン | 32x32 | - | - |
写真 | 48x48 | - | - |
一覧 | 16x16 | 16x16 | 16x16 |
詳細 | 16x16 | 16x16 | 16x16 |
並べて表示 | 48x48 | 48x48 | 48x48 |
コンテンツ | - | - | 32x32 |
デスクトップ | 32x32 | 48x48 | 48x48 |
タスクバー | 16x16 | 16x16 | 32x32 |
タスクトレイ | 16x16 | 16x16 | 16x16 |
メモ:
Windows 7 のペイント(mspaint.exe)には、64x64と256x256の間のサイズは存在しない。
ICO (file format) - Wikipedia
What is a Windows XP Icon
Icons - MSDN
Favicon
Favicon
アイコンエディター
KH IconStudio 2007 1500円
Microangelo Creation $54.95
RealWorld Icon Editor $34
Delphi リソース形式 (.DCR/.RES) |
---|
DCRファイルは拡張子こそ違うものの、RESファイルと同じ構造をしてると思われます。
参考にしたドキュメント
32bitリソースファイルのドキュメント(英語 HTML文書 wotsitから入手可)
↑を部分訳したもの 主に表の部分だけを訳してあります。緑色の部分は勝手に書き加えました。(汗;
FineViewでの対応
DCRファイルのリソース(カーソル、ビットマップ、アイコン)を表示します。
画像以外のリソースタイプには対応していません。
リソースが複数個登録されてる場合は、一番最初に検出したリソース(= RCスクリプトで一番上に定義されたリソース)を表示します。
まず、作り方
1) 最初に、拡張子RCのテキストファイルを作成します。
ex) sample1.rc
2) 続いて、テキストを開いてリソースを定義します。
-------------------------------------------------- sample1.rc START
DIGIT_SMALL BITMAP digit_5x7_lot.bmp
DIGIT_MIDDLE BITMAP digit_6x7_lot.bmp
DIGIT_LARGE BITMAP digit_6x8_lot.bmp
-------------------------------------------------- sample1.rc END
3) リソースコンパイラでコンパイルします。
> BRCC32 sample1.rc
RESファイルの作り方はこんな感じです。
コンパイルするとsample1.rcと同じフォルダ内にsample1.resというファイルができているハズです。
ちなみに、BRCC32は、Delphiのbinフォルダにあります。コマンドラインツールなのでDOSプロンプトから実行します。
次に使い方
DelphiのIDEに移ります。メインフォームのimplementationのあたりのコードを示します。
RESファイルはちゃんとパスのとおったところに用意しておいてください。
(RESファイルをDCRにリネームしても同じように使うことができます。)
ex)
--------------------------------------------------
unit sample;
interface
(省略)
implementation
{$R *.dfm}
{$R sample1.res} // こんな感じでココに追加します。
--------------------------------------------------
ex)
--------------------------------------------------
SrcBmp := TBitmap.Create;
SrcBmp.LoadFromResourceName(HInstance, 'DIGIT_SMALL');
--------------------------------------------------
最後に
RESファイルに、定義されてないリソースタイプのリソースを格納することができます。
格納したリソースを使うにはその形式の展開コードが必用になります。
展開用コードがストリームに対応していれば、簡単にリソースを扱うことができます。
問題になるのは、その形式の展開コードがストリームに対応していない場合です。
ファイルに落として読み込むということもできますが、
とてもスマートな方法とは言えません。ただ妥協できるならこの方法が楽です。
残念なことに、TMediaPlayerはストリームに対応していません・・・(涙。
各画像形式の仕様書は、Wotsitから得ることができます。
Wotsit
画像形式に限らず、いろいろなファイル形式の仕様書が入手できます。
Programmers Heaven
画像をデコードするためのサンプルコードなどを入手できます。
The Graphics File-Format Page
画像形式や、3D形式の仕様書が入手できます。
tnt
3D形式の仕様書が入手できます。→ リンク切れ
AVALON
FTPサイト。3DSや、OBJのリソースが落ちています。→ リンク切れ
P.S. Googleで調べる場合は、各画像形式の名前と"file format specification"と入力すると
ほしい情報へ辿りつきやすくなります。
マッキントッシュやアミガといったマシンは、エンディアンがインテルのマシンとは異なります。
これらのマシンで生まれた画像形式をデコードするには、スワップ処理が必要です。
→ エンディアンとスワップ処理。
TIFF, TGA, IFF, SGI, BMP, PSD などの画像形式では、RLEというエンコードが使われてます。
ちなみに、エンコード=圧縮=符号化。デコード=展開=復号化です。
RLEは、画像以外の分野でも広く使われています。
→ エンコーディング RLE。