Win32上で圧縮形式の画像データを読み込む方法を御存知の方いらっしゃいますか? 無知なもので、bmp形式のイメージ読み込みしかできないんです。LoadImage関数みたいに一発で読める関数があればラクですけど、面倒な方法でも構わないので知ってる人いたらお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんな感じでしょうか?>参考URL


もしくは
http://www.k-work.co.jp/jpegbook.html
http://www.intel.co.jp/jp/developer/support/perf …
この辺をあたってみたらいかがでしょう?
最近は JPEG-2000 という新しいフォーマットもできつつあるようですね。現行のフォーマットとの互換性は無いらしいですが、今まで以上に圧縮が可能で、かつ画質は良い、理論上ブロックノイズは出ないというかなり期待のものです。

GIFは個人でやるのは「もう」やめた方が良いですね。

参考URL:http://www.sfc.keio.ac.jp/~akimichi/computer/jpeg/
    • good
    • 0
この回答へのお礼

おおおぉぉ!!
教えて頂いたULR、私の要望にズバッとはまっております。感謝!!
書籍については 必ずや購入しようかと。
なにしろ画像ファイル内部の構造に関する知識が
少ない少ない(BMP形式しか知らない‥‥)
その手法を実際に使うかどうかは、まだ怪しいん
ですけど 貪欲に覚えにゃならないことが多いので。

非常に助かります ありがとうございました。

お礼日時:-0001/11/30 00:00

画像ビュアでSUSIEという有名ソフトがあります。


このソフトは画像ローダなどをプラグインとして実装しています。
このプラグインを使ってロードしてはいかがでしょうか。
そのようなソフトは世間にたくさん存在しています。
まずSUSIEのサイトを検索して、そこのリンクをたどると、
プラグインを利用するサンプルがあります。
たぶん、カナさんという方へのリンクだと思います。
手がかりにはなるでしょう。

ちなみにSUSIEも以前はGIFに対応していました。
そのため古い付録CDを探せば、
GIFのプラグインも収録されていると思います。
なお、プラグインはVCからでもVBからでも使えます。

この回答への補足

しかしど~にも、自分でコード構築しないと納得いきそうになかったりする(爆)
ヘンなとこで自力本願(?)だな‥‥
そんわけで そっちの手法わかる人、切にお願いします。

補足日時:2000/12/06 02:12
    • good
    • 0
この回答へのお礼

ありがとうございます、早速情報を参考に検索してみますね(笑)

お礼日時:-0001/11/30 00:00

ああ、言い忘れましたがGIFはダメです。


GIFは特許上の問題で、ただでは使えなくなっています。
    • good
    • 0

基本的にはWin32APIに用意されてるものではないです。


ですから自分でデコードルーチンを書かないとなりません。
楽するなら、DLLを使えばいいと思います。
フリーのものでは、下記Vectorのサイトなど探せばあるでしょう。
最近はブラウザなどで当たり前にJPEGやGIFの表示が出来ますので
多分Windowsにも標準のDLLがあると思いますけど、
手もとのMSDN検索したらCD入れろと言われて探すのが
面倒なので、どうぞやってみてください(笑

DLLでも面倒なら、COMオブジェクトを使うって手もあります。

参考URL:http://www.vector.co.jp/soft/win95/prog/se148530 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ええと、自分はVC++使ってるんでVBのコードだと
無理かも知れないです(汗) 一応VectorからDLLをDL
しましたが、TransG32は既にマシンに入ってました。
デコードルーチン書きたいけど手法がどうにもわからんです。

コードでカバーするくらいは然程手間とも思わないんで、
関連書籍や何かあったら教えていただけませんか?
それとCのソースで参照できるのがあったらメールに
添付で送ってもらえると非常に助かります。
他力本願だな~(笑)
ヘボい質問ですまんです。ファイルの仕様って知らない事多くて‥‥まだまだお勉強せないかんですな。

お礼日時:-0001/11/30 00:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動画の読み込み速度を上げる方法ってありませんか?

現在動画読み込み速度は1秒約100KB(800kbps)です

ファイルやゲームのダウンロードの速度は一秒570~620KB(4.5MB~4.9MB)
プロバイダで契約しているのは5Mbpsです。

なぜ動画の方が遅くなるのでしょうか?
動画がカクカクして見にくいです。(画質を下げろっていう回答はやめてください)
ダウンロード中でもありません。

メモリは8GB
GPUは内臓のでintel HD Graphics3000 を使っています。
CPUはintel corei7 第二世代のを使っています。
OSはwin8.1です。
HDDは750GBあって50GBしかつかってません。

最適化もしました。ブラウザのキャッシュクリアもしました。

Aベストアンサー

驚きの事実 : 相手の送ってくれる以上のモノは受け取れません。

>なぜ動画読み込みのほうが遅いのでしょうか?

動画サイトのサーバーの送り出し速度は1秒約100KB(800kbps)
ファイルサーバーやゲームサーバーの ア ッ プ ロ ー ド の速度は一秒570~620KB(4.5MB~4.9MB)

動画サイトのサーバーの方がそもそも能力が低いか、そのとき混雑していたのでしょう。

自宅--回線--プロバイダ--(インターネット)--各種サーバー
質問者は自分の側の事情しか考えたことないようですが、通信ってのは「相手」の存在するものです。
インターネットの向こう側にあるサーバーの能力・混雑具合はまちまちです。

有料・無料で区別しているところなら、お金払うといいでしょう。

参考URL:https://secure.nicovideo.jp/secure/register?from=header

QLoadImageを使ったアイコンファイルの読み込みの前処理

いつも、お世話になっております。
小生、只今WindowsXPSP3上にてC言語とWin32APIを使い、BCC5.5.1でコンパイルし、Windowsプログラミングを勉強しています。

アイコンの読み込みについて質問なのですが、
WndProc関数内のWM_CREATEメッセージにて、アイコンを読み込みたいのですが、ビットマップを読み込む時の様に、CreateCompatibleDCを使い、
メモリデバイスコンテキストを作成する必要があるのでしょうか??

以下にコードを記します。

お忙しい中、大変、申し訳ございませんが。
先輩方、アドバイスの方、宜しくお願いします。

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE, LPCSTR);
BOOL InitInstance(HINSTANCE, int, LPCSTR);

int WINAPI WinMain(
HINSTANCE hCurInst,
HINSTANCE hPrevInst,
LPSTR lpsCmdLine,
int nCmdShow)
{
MSG msg;
BOOL bRet;
LPCSTR szClassName = "アイコンを読み込む";

if(!InitApp(hCurInst, szClassName)){
return FALSE;
}

if(!InitInstance(hCurInst, nCmdShow, szClassName)){
return FALSE;
}

while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){
if(bRet == -1){
MessageBox(NULL, "GetMessage Error", "Error", MB_OK);
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int)msg.wParam;
}

//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName)
{
WNDCLASSEX wc;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(
NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return (RegisterClassEx(&wc));
}

//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName)
{
HWND hWnd;

hWnd = CreateWindow(
szClassName,
"Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);

if(!hWnd){
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
static HICON hIcon;

switch(msg){
case WM_CREATE:
//ここにメモリデバイスコンテキストを取得の処理が必要??
hIcon = (HICON)LoadImage(
NULL,
"Linux.ico",
IMAGE_ICON,
0,
0,
LR_LOADFROMFILE);
if(hIcon == NULL){
MessageBox(hWnd,
"It failed in reading the icon file.",
"Error",
MB_OK | MB_ICONWARNING);
return 0;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}

いつも、お世話になっております。
小生、只今WindowsXPSP3上にてC言語とWin32APIを使い、BCC5.5.1でコンパイルし、Windowsプログラミングを勉強しています。

アイコンの読み込みについて質問なのですが、
WndProc関数内のWM_CREATEメッセージにて、アイコンを読み込みたいのですが、ビットマップを読み込む時の様に、CreateCompatibleDCを使い、
メモリデバイスコンテキストを作成する必要があるのでしょうか??

以下にコードを記します。

お忙しい中、大変、申し訳ございませんが。
先輩方、アド...続きを読む

Aベストアンサー

>アイコンの読み込みについて質問なのですが、
>WndProc関数内のWM_CREATEメッセージにて、アイコンを読み込みたいのですが、ビットマップを読み込む時の様に、CreateCompatibleDCを使い、
>メモリデバイスコンテキストを作成する必要があるのでしょうか??

不要なハズです。
何か問題でも発生していますか?

hIconがLoadImage()の後でもNULLのままになっているから…
とかでしょうか?
GetLastError()でエラーの理由が取得できると思います。

ちなみに、掲示されたコードだと「カレントディレクトリ」のLinux.icoというアイコンファイルを読み込みます。
# そして、カレントディレクトリはプログラム実行中に変化する可能性があります。

Qファイル読み込み/書き込み速度を上げるには

下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか?

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data"));
BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data"));
int c ;
while((c = in.read()) != -1)
{
out.write(c);
}
in.close();
out.flush();
out.close();

Aベストアンサー

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom() で FileInputStream 側から取り出した FileChannel のインスタンスを指定する。

例) in は FileInputStream のインスタンス, out が FileOutputStream のインスタンスの場合。

FileChannel fcin = in.getChannel(), fcout = out.getChannel();
fcout.transferFrom(fcin, 0, fcin.size());

速くなるかどうかは環境によって微妙に違うと思いますが、効率よくやる方法が2つあります。

1. 1バイトづつ読み書きするのではなくて byte[] で1000バイトとかの塊を読んでそのまま塊を書くようにする。(こうすると read, write をする回数が減るので少し速いと思います)。

2. FileInputStream と FileOutputStream のインスタンス双方から getChannel() で java.nio.channels.FileChannel のインスタンスを取り出し、FileOutputStream 側から取り出した FileChannel のインスタンスに対して transferFrom()...続きを読む

Q読み込んだbmpファイルへのテキスト描画(合成?)の方法

VC++.netにてプログラミングしています.
BMPの画像ファイルを読み込み,その画像ファイルへ,画像ファイル名を描き込みたいと考えています.
描き込みの方法が分かりません.お助けください.

Aベストアンサー

・画像をメモリデバイスコンテキスト(MDC)へ展開
・あとは普通にTextOut()なり、フォント系APIを使うなりして、お好みの字をMDCへ描画
・MDCの内容を画像ファイル化

こんな感じでできます。

Qプレステ2の読み込み速度について

SCPH-15000→SCPH-79000(90000)は、SONYによると読み込み速度は変わらないとの返答を得たのですが、読み込み速度が速いという噂も聞きました。実際のところどうなのでしょうか?

Aベストアンサー

そうですね。若干早いような気がしますね。基本的にどんどん高性能になってきていますから、読み込み速度、処理能力などよくなってるはずですよ。

QLoadImage関数について(VC++)

こんにちわ、Visal Studio 2005(C++)のフォームアプリケーションでプログラミングしているものです。LoadImage関数を使って、読み込んだ画像を指定のサイズにリサイズ?したいのですが、LoadImage関数の使い方がよくわかりません。『プログラム上で画像作成』という質問とほぼ質問内容がかぶっているのですが、そちらの回答を見て実効してもうまくいきません。
そちらで書いてあることは、たとえばピクチャーボックスに画像を表示させたい場合なのですが、
pictureBox1->Image = ::LoadImage(file/*ファイル名*/,x/*指定したx座標*/,y/*指定したy座標*/); 
といった感じでできるらしいのですが、::の後にLoadImageがでてきません。これは何かこの記述をする前に、さらに記述が必要なのでしょうか?
その後には、プロパティを開いて共通言語ランタイムサポートを「共通言語ランタイムサポート(/clr)」に設定すればできるとも書いてありますができません。
お分かりの方がいましたら回答お願いします。

こんにちわ、Visal Studio 2005(C++)のフォームアプリケーションでプログラミングしているものです。LoadImage関数を使って、読み込んだ画像を指定のサイズにリサイズ?したいのですが、LoadImage関数の使い方がよくわかりません。『プログラム上で画像作成』という質問とほぼ質問内容がかぶっているのですが、そちらの回答を見て実効してもうまくいきません。
そちらで書いてあることは、たとえばピクチャーボックスに画像を表示させたい場合なのですが、
pictureBox1->Image = ::LoadImage(file/*ファイル名*/...続きを読む

Aベストアンサー

FormのPaintイベントに描画コードを記述するのであれば
this->Invalidate();
などで フォームの再描画を促さなくてはいけません

pictureBox1->Invaliedate();
を実行するなら PictureBoxのPaintイベントを記述しましょう

大きさを変更した画像を保存するには
保存用のBitmapオブジェクトが必要です

Bitmap ^bmpsave = gcnew Bitmap( 200, 200 );
Graphics ^gSave = Graphics::FromImage( bmpsave );
gSave->DrawImage( b, 0, 0, 200, 200 );
delete gSave;
bmpsave->Save("ファイルパス", ImageFormat::Jpeg );
delete bmpsave;
といった具合でしょう ・・・

Qパソコンのドライブを購入したのですが、安いためか最大読み込み速度と書き込み速度がCD-Rで24xと記

パソコンのドライブを購入したのですが、安いためか最大読み込み速度と書き込み速度がCD-Rで24xと記載してありました。しかし、自分は48x対応のCDをパソコンにコピーしたいのです。このドライブに自分が持っているCDを挿入しても非対応なのでしょうか?それとも、読み込み速度が遅いだけで、一応対応するのでしょうか?

Aベストアンサー

>読み込み速度が遅いだけで、一応対応するのでしょうか?

結論は、問題なく対応します。
そもそも
>自分は48x対応のCDをパソコンにコピーしたいのです。

読み込みが48x 対応のCDなんて存在しません。
CDの読み込み速度は、乱暴な言い方をすると無限大で、
使用するドライブによって、x倍速の制限がかかります。
48x 対応などの表示は書き込み速度の表示です。

Qraw形式からbmp形式への書き込み (画像処理)

今、raw形式のファイルを読み込んで、bmp形式への書き込みを
行うプログラムを作成しているのですがうまくいきません.

作成したプログラムの一部は以下のようになっています.

------------------rawファイルを読み込む関数の一部-------------
//1次元配列の確保
tmp=us_Calloc2(width,height);
//画像の読み込み
fread(tmp,sizeof(unsigned short),width*height,fp);
//2次元配列の確保
img->data=us_Calloc1(width,height);
//1次元配列から2次元配列にデータを移動する
for(i=0; i<height; i++){
for(j=0; j<width; j++){
img->data[i][j]=tmp[(width*i)+j];
}
}
------------------------------------------------------------
--------------bmpファイルに書きこむ(一部)--------------
//bufのメモリ領域の確保
buf=us_Calloc2(width,height);

for(i=0; i<height; i++){
for(j=0; j<width; j++){
buf[(width*i)+j]=img->data[i][j];
}
}
//BMPのファイルヘッダーの出力(省略)
//BMPの情報ヘッダーの出力(省略)
//画像データの出力
if(fwrite(buf,sizeof(unsigned short),size,fp)!=size){
printf("画像をBMPに書き込むことができませんでした.\n");
free(buf);
fclose(fp);
exit(-1);
}
}

このように書いたのですが、うまくBMPファイルに出力できません.

アドバイスよろしくお願いします.

今、raw形式のファイルを読み込んで、bmp形式への書き込みを
行うプログラムを作成しているのですがうまくいきません.

作成したプログラムの一部は以下のようになっています.

------------------rawファイルを読み込む関数の一部-------------
//1次元配列の確保
tmp=us_Calloc2(width,height);
//画像の読み込み
fread(tmp,sizeof(unsigned short),width*height,fp);
//2次元配列の確保
img->data=us_Calloc1(width,height);
//1次元配列から2次元配列にデータを移動する
for(i=0; i<height; ...続きを読む

Aベストアンサー

うーむ。流石にこれだけではちょっと判らないですね。
取り敢えず

//画像データの出力
if(fwrite(buf,sizeof(unsigned short),size,fp)!=size)

↑は画像1ピクセルにつき16ビットと言う事でしょうか?
BMP情報ヘッダーの設定が16ビット用のビットフィールドに設定されていますか?

私はRAWの事は知らないのですが、RAWからBMPに変換する際、16ビット用のビットフィールドに対応したRGB5:6:5の配置をしないと正しく表示されないのでは?

BMPへの変換は24ビットもしくは32ビットにすると楽です。

Q新旧2台のPCでDVD Decrypterの読み込み速度が違うのはナゼ??

新旧2台のPCがあるのですが…
DVDをDVD Decrypterで読み込まして見ると読み込み速度が3倍ぐらい違います。
しかもスペックが劣る旧型のPCの方が新PCより早いのです。

●旧型 WindowsXP SP2
    Pentium4 3.2G
ドライブ GSA-4163B
DVD-DL 読み込み 2.4X~4X

●新型 WindowsXP SP3
    Quad Q6600 2.4G
ドライブ LH-20A1P
DVD-DL 読み込み 不明

多分、ReadSpeedもLH-20A1Pの方が早いかと…。
DVD Decrypterの設定も両PC共に「デバイス」の「オプション」の読み込み速度を「最大」に設定しています。

こういった環境でDVD-DLを読み込ませると旧型は20分ほどで、
新型は1時間ぐらいかかってしまいます。

これは何故でしょうか??

Aベストアンサー

アプリケーション・プログラム(DVD Decryter)が、

マルチスレッド対応プログラムでないからです。

Q読み込んだBMPデータの行方

参考書を元にBMPを読み込み、
BYTE*型にデータを移して、画像処理や転送に利用できるようにしたいのですが、
どこに画像データの実体が有るのかがよくわかりません・・。
----------
static LPBYTE lpDIB = NULL;
static LPBITMAPINFO lpbiInfo;
static LPDWORD lpPixel;

LPBYTE lpBMP;
LPBITMAPINFOHEADER lpbiBMPInfo;
LPBYTE lpBMPPixel;
BYTE* ppp;

static int iWidth, iHeight, iLength;
int iFileSize;
DWORD dwOffset;
int i, j;

HANDLE fhBMP;
DWORD dwRead;

HDC hdc;
PAINTSTRUCT ps;

/*BMP取得*/
//ファイルオープン
fhBMP = CreateFile("test.bmp", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (fhBMP == INVALID_HANDLE_VALUE) {
MessageBox(NULL, "test.bmpが見つかりません。", "エラー", MB_OK);
return 0;
}

//ファイルサイズ取得
iFileSize = GetFileSize(fhBMP, NULL);

//ファイル読み込みバッファ確保
lpBMP = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iFileSize);

//ファイル読み込み
ReadFile(fhBMP, lpBMP, iFileSize, &dwRead, NULL);

//ファイルを閉じる
CloseHandle(fhBMP);

//BMP内のBITMAPINFO取得
lpbiBMPInfo = (LPBITMAPINFOHEADER)
(lpBMP + sizeof(BITMAPFILEHEADER));

//先頭からピクセル列までのオフセット取得
dwOffset = *(LPDWORD)(lpBMP + 10);

//BMP内ピクセル列の先頭アドレス計算
lpBMPPixel = lpBMP + dwOffset;

//ビットマップの大きさ取得
iWidth = lpbiBMPInfo->biWidth;
iHeight = lpbiBMPInfo->biHeight;

//BMPピクセル列の1ラインの長さを計算
if (iWidth % 4 == 0) {
iLength = iWidth * 3;
} else {
iLength = iWidth * 3 + (4 - (iWidth * 3) % 4);
}

//DIB用バッファを確保
lpDIB = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(BITMAPINFO) + iWidth * iHeight * 4);

//DIB用ポインタ分配
lpbiInfo = (LPBITMAPINFO)lpDIB;
lpPixel = (LPDWORD)(lpDIB + sizeof(BITMAPINFO));

//BITMAPINFO設定
lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbiInfo->bmiHeader.biWidth = iWidth;
lpbiInfo->bmiHeader.biHeight = iHeight;
lpbiInfo->bmiHeader.biPlanes = 1;
lpbiInfo->bmiHeader.biBitCount = 32;
lpbiInfo->bmiHeader.biCompression = BI_RGB;

//BMP内のピクセル列を32ビット化してコピー
for (i = 0;i < iHeight;i++)
for (j = 0;j < iWidth; j++)
CopyMemory(lpPixel + j + i * iWidth,
lpBMPPixel + j * 3 + i * iLength, 3);

//ファイル読み込みバッファ解放
HeapFree(GetProcessHeap(), 0, lpBMP);


/*描画*/
hdc = BeginPaint(hWnd, &ps);

//DIBをウインドウのDCに描画
StretchDIBits(hdc, 0, 0, iWidth, iHeight,
0, 0, iWidth, iHeight, lpPixel, lpbiInfo,
DIB_RGB_COLORS,SRCCOPY);

EndPaint(hWnd, &ps);

----------
描画部分のStretchDIBits()を調べて
lpPixelに格納されているように思えたのですが、これはただのDWORDですし。
lpBMPPixelだとしても、描画では全く使われていないのが不可解で。

なぜこう(描画にDWORD)なっているのでしょうか?
どこに画像データが有るのでしょうか?

参考書を元にBMPを読み込み、
BYTE*型にデータを移して、画像処理や転送に利用できるようにしたいのですが、
どこに画像データの実体が有るのかがよくわかりません・・。
----------
static LPBYTE lpDIB = NULL;
static LPBITMAPINFO lpbiInfo;
static LPDWORD lpPixel;

LPBYTE lpBMP;
LPBITMAPINFOHEADER lpbiBMPInfo;
LPBYTE lpBMPPixel;
BYTE* ppp;

static int iWidth, iHeight, iLength;
int iFileSize;
DWORD dwOffset;
int i, j;

HANDLE fhBMP;
DWORD dwRead;

HDC hdc;
PAINTSTR...続きを読む

Aベストアンサー

>どこに画像データが有るのでしょうか?

>//ファイルサイズ取得
>iFileSize = GetFileSize(fhBMP, NULL);
>//ファイル読み込みバッファ確保
>lpBMP = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iFileSize);
>//ファイル読み込み
>ReadFile(fhBMP, lpBMP, iFileSize, &dwRead, NULL);

まず「ファイルの中身」が、ヘッダーや、生の画像データごと、まるまま「lpBMPが指しているメモリ」に入って来る。

このメモリはHeapAllocで確保している。

つまり「bmpファイルの中身そのまま」が「lpBMPが指すメモリ」に居る。

>//BMP内ピクセル列の先頭アドレス計算
>lpBMPPixel = lpBMP + dwOffset;

で、画像データは、lpBMPからdwOffsetだけ進んだ先にあるので、lpBMPPixelに「ファイルから読み込んだ、生の画像データの先頭のポインタ」を代入している。

>//DIB用バッファを確保
>lpDIB = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFO) + iWidth * iHeight * 4);

一方、実際に描画に使うデータはDIBデータなので、ヘッダとDIBデータのサイズを求め、そのサイズ分だけのメモリを確保し、確保したメモリの先頭アドレスをlpDIBに代入している。

>//DIB用ポインタ分配
>lpbiInfo = (LPBITMAPINFO)lpDIB;
>lpPixel = (LPDWORD)(lpDIB + sizeof(BITMAPINFO));

で、確保したメモリの先頭部分がヘッダ、ヘッダの大きさ分だけ進んだアドレスがDIBピクセルデータなので、それぞれをlpbiInfo、lpPixelに代入している。

次に、lpbiInfoとlpPixelが指すアドレスに「ファイルから読み込んだデータを、DIBデータに合うように変形して、コピー」して、DIBデータを作る必要がある。

それが

>//BITMAPINFO設定
>lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
>lpbiInfo->bmiHeader.biWidth = iWidth;
>lpbiInfo->bmiHeader.biHeight = iHeight;
>lpbiInfo->bmiHeader.biPlanes = 1;
>lpbiInfo->bmiHeader.biBitCount = 32;
>lpbiInfo->bmiHeader.biCompression = BI_RGB;

>//BMP内のピクセル列を32ビット化してコピー
>for (i = 0;i < iHeight;i++)
>for (j = 0;j < iWidth; j++)
>CopyMemory(lpPixel + j + i * iWidth,
>lpBMPPixel + j * 3 + i * iLength, 3);
の部分。

「lpBMPが指す、ファイルの中身」を「lpbiInfoが指すヘッダ、lpBMPPixelが指すDIBピクセルデータ」にコピーし終わったなら、もう「lpBMPが指す、ファイルの中身」は不要なので
>HeapFree(GetProcessHeap(), 0, lpBMP);
で解放している。

このプログラム、lpDIBが指してるDIBヘッダ+DIBデータのメモリ、確保だけ行って使い終わってから解放してないので、何度も実行するとメモリがリークするので注意。

要は
lpbiInfo = (LPBITMAPINFO)lpDIB;
lpPixel = (LPDWORD)(lpDIB + sizeof(BITMAPINFO));
が肝心の部分で、
lpbiInfo⇒読み込んだデータのDIBヘッダー
lplpPixel⇒読み込んだデータのDIB画像データ
って事。

因みに、lpDIBは「DIBヘッダーとDIB画像データの両方を合わせた、確保したメモリのアドレス」を保持していて、不要になったら
HeapFree(GetProcessHeap(), 0, lpDIB);
で解放しなければならない。

>どこに画像データが有るのでしょうか?

>//ファイルサイズ取得
>iFileSize = GetFileSize(fhBMP, NULL);
>//ファイル読み込みバッファ確保
>lpBMP = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iFileSize);
>//ファイル読み込み
>ReadFile(fhBMP, lpBMP, iFileSize, &dwRead, NULL);

まず「ファイルの中身」が、ヘッダーや、生の画像データごと、まるまま「lpBMPが指しているメモリ」に入って来る。

このメモリはHeapAllocで確保している。

つまり「bmpファイルの中身そのまま」が「lpBMP...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング