モノクロのビットマップ(ウインドウズ98とかのペイントのヤツ)を
PGM(Portable GrayMap)形式に変換したいのですが,フリーソフトでではなく,
C言語で理解したいので,どなたかご存知の方,教えて下さい.

参考になりそうなサイトや,本などでも結構ですので,よろしくお願いします.

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

A 回答 (1件)

参考URLに画像を扱うためのライブラリがあります。

ソース公開なので、ご自分で見ることが可能ですよ。

ではでは☆

参考URL:http://www.paintlib.de/paintlib/
    • good
    • 0

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

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

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

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

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Qビットマップ画像表示

いつもお世話になっております。
VS2005でC++を用いてWindowsアプリケーションの作成をしています。

子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を
表示させようとプログラムを組んだのですが、
子ウィンドウを出してもビットマップ画像が表示されません。

以下のようなプログラムを追加しました。
---------------------------------
///リソーススクリプト/////////////////////////////////
 IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp"

///ヘッダースクリプト/////////////////////////////////
 #define IDB_BITMAP1   3000

///ソーススクリプト///////////////////////////////////
void ShowMyBMP(HWND hWnd, HDC hdc){
  HDC hmdc;
  HBITMAP hBitmap;
  BITMAP bmp;
  HINSTANCE hInst;
  int BMP_W, BMP_H;

  hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
  hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得
  GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る
  BMP_W = (int)bmp.bmWidth;  //画像の幅
  BMP_H = (int)bmp.bmHeight;  //画像の高さ

  hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得
  SelectObject(hmdc, hBitmap);
  BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);
  StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);
  DeleteDC(hmdc);//デバイスコンテキストハンドルを開放
  DeleteObject(hBitmap);
  return;
}
---------------------------------

ShowMyBMP関数は子ウィンドウを表示するときに実行されます。
全て載せられないので追加した部分のみプログラムを載せましたが、
この部分だけでも、プログラムの間違い等はありませんでしょうか。
ご教授お願いいたします。

いつもお世話になっております。
VS2005でC++を用いてWindowsアプリケーションの作成をしています。

子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を
表示させようとプログラムを組んだのですが、
子ウィンドウを出してもビットマップ画像が表示されません。

以下のようなプログラムを追加しました。
---------------------------------
///リソーススクリプト/////////////////////////////////
 IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp"

/...続きを読む

Aベストアンサー

>実はさらにグローバルにhWndが宣言されてて
本当はその可能性も考えなくもありませんでしたが、まさかそんな事はしないだろう、あり得ないだろうと、否定していました。

あり得るとして、その考えを推し進めると。
コンパイルエラーが起こる→hWndが宣言されていませんと出る。
それならば、hWndをグローバルで宣言してしまえと HWND hWnd;を記述
コンパイルエラーはなくなる。
※hChdWnd等はコピらず、コンパイルエラーが出なくなった事で満足していると仮定

で以下の個所では hWndに対して描画、初期化されていないウィンドウハンドルなので、実際にはどこに描画されているのかは不明。
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
ShowMyBMP(hWnd, hdc);
break;

そもそも有効なウィンドウハンドルではないため、エラーを返している可能性もあるのだが、エラー判定もしていないためそのことに気付いていない?

あるいは、以下のように=0として宣言しているため、デスクトップのウィンドウハンドルとして有効な値となっている。
HWND hWnd=0;
※VC++って、初期化されていない変数を参照しましたとかのWarningって出ましたっけ?出るなら適当な値で初期化するってあり得るかなと。

しかし、EndPaint(hWnd , &ps)を呼び出していないため、描画が更新されずにデスクトップ(あるいは偶然ウィンドウハンドルが一致したどこか別の場所)に描画されている事に気付いていない?


LongSecretさんの指摘や、aaaaaさんの答え見て、質問者様の力量を推測してみると、『あり得るぞ、大いにあり得るぞ』と思えてきたんですが。

まさかこんなことしてませんよね?と確認の意味で。

>実はさらにグローバルにhWndが宣言されてて
本当はその可能性も考えなくもありませんでしたが、まさかそんな事はしないだろう、あり得ないだろうと、否定していました。

あり得るとして、その考えを推し進めると。
コンパイルエラーが起こる→hWndが宣言されていませんと出る。
それならば、hWndをグローバルで宣言してしまえと HWND hWnd;を記述
コンパイルエラーはなくなる。
※hChdWnd等はコピらず、コンパイルエラーが出なくなった事で満足していると仮定

で以下の個所では hWndに対して描画、初期化されて...続きを読む

Qメモリデバイスコンテキスト&ビットマップハンドル

static VOID _SetSize(pLayer object, LONG w, LONG h)
{
LayerEx * obj;

obj = (LayerEx *)object;
obj->size.x = w;
obj->size.y = h;

if(obj->hBitmap){
HDC hdc , hNewDC;
HBITMAP hNewBitmap;

hdc = object->GetDC(object);

hNewDC = CreateCompatibleDC(hdc);
hNewBitmap = CreateCompatibleBitmap(hdc , w , h);
SelectObject(hNewDC , hNewBitmap);
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
DeleteObject(hNewDC);

object->DeleteDC(object , hdc);

DeleteObject(obj->hBitmap);
obj->hBitmap = hNewBitmap;
}

一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、

BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
↑なぜBitBltで転送しているのかわかりません。
新しく生成したビットマップをSelectObjectで登録したらいいような感じがするんですが・・・

DeleteObject(hNewDC);
↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。

分かる人いたら教えてください。説明足りなかったらごめんなさい^^;


↓一応object->GetDC(object)のソースです。
static HDC _GetDC(pLayer layer)
{
LayerEx * obj;
HDC hResult;

obj = (LayerEx *)layer;

if(obj->hBitmap == NULL){
HDC hdc;

hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
obj->hBitmap = CreateCompatibleBitmap(hdc, obj->size.x, obj->size.y);
hResult = CreateCompatibleDC(hdc);
SelectObject(hResult, obj->hBitmap);
DeleteDC(hdc);
}
else{
hResult = CreateCompatibleDC(NULL);
SelectObject(hResult, obj->hBitmap);
}

return hResult;
}

static VOID _SetSize(pLayer object, LONG w, LONG h)
{
LayerEx * obj;

obj = (LayerEx *)object;
obj->size.x = w;
obj->size.y = h;

if(obj->hBitmap){
HDC hdc , hNewDC;
HBITMAP hNewBitmap;

hdc = object->GetDC(object);

hNewDC = CreateCompatibleDC(hdc);
hNewBitmap = CreateCompatibleBitmap(hdc , w , h);
SelectObject(hNewDC , hNewBitmap);
BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
DeleteObject(hNewDC);

object->DeleteDC(object , hdc);

DeleteO...続きを読む

Aベストアンサー

★アドバイス
>BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
>↑なぜBitBltで転送しているのかわかりません。
 最初にCreateCompatibleDC、CreateCompatibleBitmap、SelectObjectの3つで
 objectのデバイスコンテキストと互換のあるメモリ・デバイスコンテキストを
 作成しています。
 このメモリ・デバイスコンテキストにobjectのイメージ画像をBitBltを使って
 コピー(転送)しています。つまり、新しく作られたメモリ・デバイスコンテキストは
 真っ黒なのでobjectのイメージ画像でコピーしたわけ。
>DeleteObject(hNewDC);
>↑あとこれはDeleteDC(hNewDC)の間違いなのでしょうか?ここも何しているか分かりません。
 間違い⇒『DeleteObject(hNewDC);』
 正しい⇒『DeleteDC(hNewDC);』
 これはsizumさんの考えであっていると思います。
 hNewDCはGDIオブジェクトではなくメモリ・デバイスコンテキストなので。
・object->GetDC(object)関数について
 この関数はobj->hBitmapがNULLなら画面(ディスプレイ全体)と互換のある
 メモリ・デバイスコンテキストを作成します。
 そしてobj->hBitmapがNULL以外の時はメモリ・デバイスコンテキストだけを
 複製してobj->hBitmapをSelectObjectで割り付けています。
 ※何にどう使うか分かりませんが、object->GetDC()関数を複数回呼び出すと
 ※obj->hBitmapのハンドルを共有するようになるようです。切り替えるためかも。
・結局_SetSize関数は
>一度生成したビットマップのサイズを変更してもう一度ビットマップを生成するプログラムらしいのですが、
 ↑
 この通りの動作を行っているようです。
 もう少し正確に(私の推測で)表現すると一度生成したメモリ上にある
 ビットマップを新たなサイズで生成しなおしているようです。多分。
 ※object->DeleteDC()の内容もあればもう少し正確に分かるかも正ないですね。

★アドバイス
>BitBlt(hNewDC , 0 , 0 , w , h , hdc , 0 , 0 , SRCCOPY);
>↑なぜBitBltで転送しているのかわかりません。
 最初にCreateCompatibleDC、CreateCompatibleBitmap、SelectObjectの3つで
 objectのデバイスコンテキストと互換のあるメモリ・デバイスコンテキストを
 作成しています。
 このメモリ・デバイスコンテキストにobjectのイメージ画像をBitBltを使って
 コピー(転送)しています。つまり、新しく作られたメモリ・デバイスコンテキストは
 真っ黒なのでobjectのイメージ画像で...続きを読む

Qツールバーのビットマップの変更

WinXP,SDKです。
たとえば、XP上で見たエクスプローラやIEのツールバーのボタンには、押した時に「押されている」状態になるものがあると思います。
IEのお気に入りのボタンなど。
押した時にこのボタンの背景が白に変化しています。(色は環境によって違うかも?)
このような事を実現するにはどうすれば良いのでしょうか。

今、レバーコントロールにツールバーを置いています。
これらのボタンはすべて「TBSTYLE_CHECK」を指定してボタンのように使用しています。
このままだと、押しているものと押されていないものがぱっと見よく分かりません。
もちろん、押してあるものは背景の色も多少変わるし分からない訳ではないのですがもっと鮮明に分かるようにしたいのです。
そこで押してあるボタンのビットマップを変えたいと考えました。
ツールバーではこのような事は出来ないのでしょうか。

Aベストアンサー

IMAGELIST押されたときのイメージリストを作成して
ToolBarに対して TB_SETHOTIMAGELISTで押されたときのイメージを追加しましょう

ただ、この方法ですとボタンの上でホバー(カーソルを留めた)した際にもこの追加のイメージが使われます


人気Q&Aランキング

おすすめ情報