モノクロのビットマップ(ウインドウズ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と関連する良く見られている質問

Qその文字ごとに変換する事はできないのでしょうか?

例えば~やサイ(動物の)と入力する時に単にやさいと
入力して変換するとどうしても野菜等の漢字にしか変換されません
まあこれは象やサイのように前後になんらかの文字をはさめば0で変換はできるのですが
長文の場合ひらがなかカタカナにしか変換されないものがたまにあります
これらを一文字あるいは二文字等に限定して変換させる事はできないのでしょうか?
つまり通常10文字中5文字単位でしか変換できないが1・2文字で変換する事は
できないか?という事です
できればマウスは使わずにキーボードだけで
分かりにくくてすいません
回答お願いします

Aベストアンサー

たぶん、これのことではないかと思いますが、

文字の変換中に、
「Shift」キーを押しながら「←」「→」キーで
変換範囲を変更できると思います。

「やさい」の場合は変換範囲を上記の方法で「や」だけに変更して、
その後「→」キーで「さい」の部分に移動(ただの移動なので「Shift」キーははなす)
して変換すればできると思います。

お試しください。

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

...続きを読む

QVistaで、誤変換や変換できないものがある

ここ最近、Windows Vista標準ので、
誤変換や文やフクスウの変換ができなくなってます。
普通の変換すらできない言葉もでてきてます。
今も2行目の「ふくすう」が変換できません。

発覚した変換できないもの(カナ変換しかできないもの)
こめんとらん=コメントラン
いか=イカ
いがい=イガイ
ふくすう=フクスウ
かいとう=カイトウ
しつもん=シツモン
おおい=オオイ
あやまる=アヤマル
ごへんかん=ゴヘンカン
おねがい=オネガイ
etc・・・・

あまりにもおおすぎて手におえません。
たまに「MicroSoft IME 誤変換」がどうとか警告がでてきます。
どうしたらなおるでしょうか?
アドバイスおねがいします。

Aベストアンサー

IME2007をお使いなら下記のURLを参照して修正プログラムをインストールされたらと思います。

IME 2007 変換精度、学習機能を改善した修正プログラムのご案内
http://www.microsoft.com/japan/office/2007/ime/fixmodule.mspx

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);
}

QVSODivxToDVD でDVDに変換できないAVIファイル

AVIファイルをDVDに変換するには、VSODivxToDVD を利用しています。ほとんどのAVIファイルは変換できますが、まれに変換できないものがあります。そのファイルは他のソフト、Avi2Dvd、AVI2ISO、DVD Flickで試してみてもできません。AVI2JPGで再出力しようとしてもできません。パソコンでは何の問題もなく再生できるので、何とかDVDに変換することができないものでしょうか?
それが可能なソフトや方法がありましたら教えて下さい。

Aベストアンサー

#2です。

・・・???
真空波動研の結果(ファイル名以降)はそれだけでしたか?

コンテナファイルの形式(まあAVIでしょうが)や音声コーデックがないですし、DivXのFourCCや、フレームレート、ビットレートが抜けてます。
48KHzというのは、音声のサンプリングレートだと思いますが、ビットレートが0(音声がない?)です。VBRというのは音声が可変ビットレートを採用しているということですが・・・

もし、真空波動研での確認内容がそれだけなら、変換に失敗したか、ファイルが壊れていて再生、変換できない、ということになると思いますよ。
再生は出来ましたか?

QC言語について質問です。 C言語のビット演算で10進数の1を左に1ビットずつずらしていって32ビット

C言語について質問です。


C言語のビット演算で10進数の1を左に1ビットずつずらしていって32ビットで表示するプログラムを書いてるんですが…最後の値が負になってしまいます。
変数の型はunsigned にしているんですが。どうしてでしょうか?

Aベストアンサー

おそらく、printf() しょ書式指定子が、 %ud ではなくて、 %d になっているためです。

ちなみに、左シフトの場合、signed でも unsigned でも、操作自体は変わりません。
(右シフトは符号の扱いがある)

それを、表示するときに、符合付きと見なすか符号無しと見なすかです。

Qにち ←なぜ漢字に変換できないのでしょうか?

【ひ】は【日】に変換できるのに、
【にち】はなぜ【日】に変換できないのでしょうか???

Aベストアンサー

もしかして「に」と「ち」で分かれて変換されてしまうということではないでしょうか?
その場合「Shift+右矢印キー」で「にち」全体にフォーカス(?)をかけて再度変換すれば「にち」で変換できると思います。

上記でない場合は、あまりに基礎的なことを言ってしまいすみません。
私もだいぶ前(PC初心者の頃)ですが、「しゅつ」が「主津(しゅ+つ)」になってしまい、「出」が出ないと大騒ぎした経験があるものですから…

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漢字変換できないまま・・・

以前よりパソコンで漢字変換できなくなったトラブルを質問していましたが、多くの方に親切な回答を頂く事ができました。しかし結局どの方法を試しても元に戻る事はありませんでした。昨日リカバリーしましたがそれでも無理でした。なのでキーボードを買い換えようと考えています。しかしキーボードの故障かどうかがわからないので買い換える前にそれを確認する方法ってあるのでしょうか?(キーボードを変えても改善されないっていうパターンが嫌なので)
ちなみに症状としては、
・半角/全角キーで言語バーのカナ変換できない。
・スペースキーと変換キーが全く効かないので変換とスペースがあけられない。
・無変換キーでひらがなをカタカナには変換できる。
・ソフトキーボードでは変換できる。

宜しくお願い致します。

Aベストアンサー

kinkakutouさん 今日は!
済みません。
追加と訂正です。
>(キーボードを変えても改善されないっていうパターンが嫌なので)
質問者さんの内容を取り違えて居ました。ご免なさい!
正:
キーボードの故障ではなさそうです。
ポイントは、言語バーの設定です。
1:言語バーの「ツール」→「プロパティ」を選択し、画面の「標準に戻す」ボタンをクリックします。
2:前回回答のページで、基本設定します。
3:設定が終了したら、もう1度「プロパティ」で右上の「設定」アイコンをクリックし、画面の「キー設定」TABのキー一覧を確認します。
>・半角/全角キーで言語バーのカナ変換できない。
キーの半角/全角が、IMEオン/オフ(入力)以下項目は全て「-」。
半角/全角キーで言語バーは、立ち上げ時は「A」→「あ」の切替えになります。
>・スペースキーと変換キーが全く効かないので変換とスペースがあけ
>られない。
キーのスペースキーは、空白・全変換・変換+次・変換+次・文節変換
・全変換を確認します。
キーのシフト+スペースキーは、入力以外は半角空白を確認します。
これでIMEは修復可能です。
恐らくポイントの1で元に戻ると思います。

kinkakutouさん 今日は!
済みません。
追加と訂正です。
>(キーボードを変えても改善されないっていうパターンが嫌なので)
質問者さんの内容を取り違えて居ました。ご免なさい!
正:
キーボードの故障ではなさそうです。
ポイントは、言語バーの設定です。
1:言語バーの「ツール」→「プロパティ」を選択し、画面の「標準に戻す」ボタンをクリックします。
2:前回回答のページで、基本設定します。
3:設定が終了したら、もう1度「プロパティ」で右上の「設定」アイコンをクリックし、画面の...続きを読む

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&Aランキング