久しぶりにWindows API &C++でプログラムを書いてみようと思い、大分前にインストールしたVisual Studio 2010を使ってプログラムを書き、ビルドしたところ、リンカでエラーが発生しました。
原因を調べたところ、.Net Frameworkのバージョンが4.5だとVC2010ではビルドできないっぽいので、思い切って2013版をインストールすることにしました。
主にC/C++と生のWindowsAPIでアプリを作るのが目的なのですが、その場合はVisual Studio Express 2013 for Windows Desktopというヤツを入れるみたいです。いままでは、Visual BasicとかC++とかの言語で分かれていたのが統合されて、1つのツールとしてつかえるようになったようです。
それでは、以下はダウンロードから起動までの手順です。
1.ダウンロード
このサイトからダウンロードできます。Microsoft Visual Studio Express 2013 for Windows Desktopというやつを選びましょう。
以下の画像の赤枠で囲まれた「今すぐインストール」という文字をクリックします。
※ダウンロードするにはMicrosoftアカウントにサインインする必要があります。
すると、以下のような画面になるので、左のExpress 2013 for Windows Desktopを選ぶと、ダウンロードが開始されます。
2.インストール
wdexpress_full.exeというインストーラがダウンロードできたはずなので、それを起動します。
起動すると、インストールが始まります。
3.起動
起動したら、新しいプロジェクトを作成します。
C++でWindowsアプリケーションを作成する場合は、以下のようにWin32プロジェクトを選択します。
以上です。
普段Web開発をしている人は息抜きにこういうもので遊んでみてはどうでしょうか?
2014年04月16日
2011年05月15日
Magick++で画像のピクセル列を書き換える
OS:Mac OS X Leopard(10.5.6)
言語:C/C++
ライブラリ:Magick++ (ImageMagick)
Magick++とC++を使うことで、画像のピクセル列にアクセスして値を参照したり書き換えたりできます。他の言語のImageMagickインターフェースでできるかはわかりませんが、ピクセル列の値を書き換えるとかっていかにもC++で画像処理しているっていう感覚で楽しいですし、既存のクラスやメソッドに無い処理を実装する場合には便利ですね。
100×100の青い画像を作成して、画像の左上(全体の1/4)をグラデーションにするプログラムを書いてみました。
作成した画像からピクセル列を生成するにはMagick::Viewクラスを使います。コンストラクタにMagick::Imageクラスのインスタンスを渡すことで、その画像のピクセル列の領域がメモリに確保されます。
生成したピクセル列からポインタを取得するには、Magick::Viewクラスのget関数を使います。
画像中の位置をx_とy_に指定して、x_とy_からの領域の大きさをcolumns_とrows_に指定します。この例では、画像の左上から縦横それぞれ50ピクセル分のピクセル列のポインタを取得しています。
元の画像(Magick::Imageクラスのインスタンス)にピクセル列の内容を反映させたい場合は、Magick::Viewクラスのsync関数を使います。この関数は呼ぶだけです。
最後にMagick::Imageクラスのwrite関数で画像ファイルとして出力しています。以下のような画像になります。
言語:C/C++
ライブラリ:Magick++ (ImageMagick)
Magick++とC++を使うことで、画像のピクセル列にアクセスして値を参照したり書き換えたりできます。他の言語のImageMagickインターフェースでできるかはわかりませんが、ピクセル列の値を書き換えるとかっていかにもC++で画像処理しているっていう感覚で楽しいですし、既存のクラスやメソッドに無い処理を実装する場合には便利ですね。
100×100の青い画像を作成して、画像の左上(全体の1/4)をグラデーションにするプログラムを書いてみました。
#include <Magick++.h>
using namespace std;
using namespace Magick;
int main(int argc,char **argv)
{
const int width = 100;
const int height = 100;
Image image(Geometry(width, height), ColorRGB(0, 0, 1));
image.type(TrueColorType);
image.modifyImage();
Pixels view(image);
PixelPacket* pixels = view.get(0, 0, width / 2, height / 2);
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
pixels[i*(width / 2)+j] = ColorRGB(1, 0, (double)j / (double)(width / 2));
}
}
view.sync();
image.write("sample.png");
return 0;
}
using namespace std;
using namespace Magick;
int main(int argc,char **argv)
{
const int width = 100;
const int height = 100;
Image image(Geometry(width, height), ColorRGB(0, 0, 1));
image.type(TrueColorType);
image.modifyImage();
Pixels view(image);
PixelPacket* pixels = view.get(0, 0, width / 2, height / 2);
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
pixels[i*(width / 2)+j] = ColorRGB(1, 0, (double)j / (double)(width / 2));
}
}
view.sync();
image.write("sample.png");
return 0;
}
作成した画像からピクセル列を生成するにはMagick::Viewクラスを使います。コンストラクタにMagick::Imageクラスのインスタンスを渡すことで、その画像のピクセル列の領域がメモリに確保されます。
生成したピクセル列からポインタを取得するには、Magick::Viewクラスのget関数を使います。
PixelPacket* Magick::View::get(
const ssize_t x_,
const ssize_t y_,
const ssize_t columns_,
const size_t rows_
)
const ssize_t x_,
const ssize_t y_,
const ssize_t columns_,
const size_t rows_
)
画像中の位置をx_とy_に指定して、x_とy_からの領域の大きさをcolumns_とrows_に指定します。この例では、画像の左上から縦横それぞれ50ピクセル分のピクセル列のポインタを取得しています。
元の画像(Magick::Imageクラスのインスタンス)にピクセル列の内容を反映させたい場合は、Magick::Viewクラスのsync関数を使います。この関数は呼ぶだけです。
最後にMagick::Imageクラスのwrite関数で画像ファイルとして出力しています。以下のような画像になります。
-
- | ImageMagick/ C/C++
-
- 0 Comment |
- 0 Trackback |
2011年05月05日
Magick++で画像を作成して出力
OS:Mac OS X Leopard(10.5.6)
ライブラリ:Magick++(ImageMagick)
言語:C++
ImageMagickのC++用のインターフェースをMagick++といいます。Magick++を使うと、ImageMagickの機能をC++のクラスとして利用できます。
今回は、Magick++を使って、画像を作成してファイルに出力するプログラムを試してみました。
以下がC++のソースコードです。
画像を生成したり、ファイルから読み込む場合はMagick::Imageクラスを使います。このクラスのコンストラクタに画像のサイズと色を指定します。ここでは、100×100ピクセルの青い画像を生成しています。
Magick::Image::pixelColorメソッドで、指定したピクセルに色を設定します。ここでは、(49, 49)の位置のピクセルを赤にしています。
最後に、Magick::Image::writeで画像ファイルとして出力します。
下のような画像が出力されます。
次にmakeファイルです。
実はmakeファイルの方が苦労しました。いろいろ試してみたのですが、libMagick++.a、libMagickCore.a、libMagickWand.a、libX11.aをリンクすれば大丈夫なようです。ヘッダーファイル(INCLUDE_DIR)やライブラリ(LIB_DIR)の場所は、環境に依ると思うので気をつけて下さい。
ライブラリ:Magick++(ImageMagick)
言語:C++
ImageMagickのC++用のインターフェースをMagick++といいます。Magick++を使うと、ImageMagickの機能をC++のクラスとして利用できます。
今回は、Magick++を使って、画像を作成してファイルに出力するプログラムを試してみました。
以下がC++のソースコードです。
#include <Magick++.h>
using namespace std;
using namespace Magick;
int main(int argc, char **argv)
{
Image image("100x100", ColorRGB(0, 0, 1));
image.pixelColor(49, 49, ColorRGB(1, 0, 0));
image.write("sample.png");
return 0;
}
using namespace std;
using namespace Magick;
int main(int argc, char **argv)
{
Image image("100x100", ColorRGB(0, 0, 1));
image.pixelColor(49, 49, ColorRGB(1, 0, 0));
image.write("sample.png");
return 0;
}
画像を生成したり、ファイルから読み込む場合はMagick::Imageクラスを使います。このクラスのコンストラクタに画像のサイズと色を指定します。ここでは、100×100ピクセルの青い画像を生成しています。
Magick::Image::pixelColorメソッドで、指定したピクセルに色を設定します。ここでは、(49, 49)の位置のピクセルを赤にしています。
最後に、Magick::Image::writeで画像ファイルとして出力します。
下のような画像が出力されます。
次にmakeファイルです。
INCLUDE_DIR = /opt/local/include/ImageMagick
LIB_DIR = /opt/local/lib
main: main.o
g++ -o main -I$(INCLUDE_DIR) -L$(LIB_DIR) main.o -lMagick++ -lMagickCore -lMagickWand -lX11
main.o: main.cpp
g++ -c -I$(INCLUDE_DIR) main.cpp
.PHONY: clean
clean:
rm -f main.o main
LIB_DIR = /opt/local/lib
main: main.o
g++ -o main -I$(INCLUDE_DIR) -L$(LIB_DIR) main.o -lMagick++ -lMagickCore -lMagickWand -lX11
main.o: main.cpp
g++ -c -I$(INCLUDE_DIR) main.cpp
.PHONY: clean
clean:
rm -f main.o main
実はmakeファイルの方が苦労しました。いろいろ試してみたのですが、libMagick++.a、libMagickCore.a、libMagickWand.a、libX11.aをリンクすれば大丈夫なようです。ヘッダーファイル(INCLUDE_DIR)やライブラリ(LIB_DIR)の場所は、環境に依ると思うので気をつけて下さい。
-
- | C/C++/ ImageMagick
-
- 0 Comment |
- 0 Trackback |
2010年09月28日
C言語の標準出力と標準入エラー出力
言語:C言語
OS:Mac OS X
最近、コマンドの出力を標準出力か標準エラー出力かで分ける処理をやったりしたので、忘れないうちに復習の意味を込めて。
標準出力とは、おなじみのprintf関数などで文字列を出力する場合に使用するストリームです。標準出力の実態は、FILE*型の変数です。このポインタにstdoutという名前を付けたものが標準出力です。
次の2行はどちらも標準出力に"Hello world"と出力します。
C言語には、もうひとつの出力ストリームがあります。標準エラー出力です。これは、主にプログラム内でエラーが発生した場合に、その旨を出力する用途で使用されます。これも、実態はFILE*型の変数で、stderrという名前が付いています。
次のプログラムは標準エラー出力に"Hello world"と出力します。
通常、標準エラーもコンソールに表示されてしまうので、区別が付きにくいのですが、次のように2>の後に出力先ファイルを指定すると、標準エラー出力だけがファイルに書き込まれます。
>は実行したプログラムの出力でファイル内容を上書きするリダイレクトという機能で、2は標準エラー出力を表します。ちなみに、1>とすると、標準出力を指定したファイルに書き出すことができます。
標準出力と標準エラー出力を使ったプログラムを作成して、それぞれがちゃんと出力されるか確認します。
ソースは以下のようになります(ファイル名はstdio.cとします)。
これを、
> cc stdio.c
でコンパイルすると、a.outという実行ファイルが生成されるので、
> ./a.out 1> stdout.txt 2> stderr.txt
で実行すると、stdout.txtには"stdout"と書き込まれ、stderr.txtには"stderr"と書き込まれます。
OS:Mac OS X
最近、コマンドの出力を標準出力か標準エラー出力かで分ける処理をやったりしたので、忘れないうちに復習の意味を込めて。
1. C言語の標準出力
標準出力とは、おなじみのprintf関数などで文字列を出力する場合に使用するストリームです。標準出力の実態は、FILE*型の変数です。このポインタにstdoutという名前を付けたものが標準出力です。
次の2行はどちらも標準出力に"Hello world"と出力します。
printf("Hello world\n");
fprintf(stdout, "Hello world\n");
fprintf(stdout, "Hello world\n");
2. C言語の標準エラー出力
C言語には、もうひとつの出力ストリームがあります。標準エラー出力です。これは、主にプログラム内でエラーが発生した場合に、その旨を出力する用途で使用されます。これも、実態はFILE*型の変数で、stderrという名前が付いています。
次のプログラムは標準エラー出力に"Hello world"と出力します。
fprintf(stderr, "Hello world\n");
通常、標準エラーもコンソールに表示されてしまうので、区別が付きにくいのですが、次のように2>の後に出力先ファイルを指定すると、標準エラー出力だけがファイルに書き込まれます。
>プログラム 2> ファイル名
>は実行したプログラムの出力でファイル内容を上書きするリダイレクトという機能で、2は標準エラー出力を表します。ちなみに、1>とすると、標準出力を指定したファイルに書き出すことができます。
3. 使用例
標準出力と標準エラー出力を使ったプログラムを作成して、それぞれがちゃんと出力されるか確認します。
ソースは以下のようになります(ファイル名はstdio.cとします)。
#include <stdio.h>
int main()
{
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
return 0;
}
int main()
{
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
return 0;
}
これを、
> cc stdio.c
でコンパイルすると、a.outという実行ファイルが生成されるので、
> ./a.out 1> stdout.txt 2> stderr.txt
で実行すると、stdout.txtには"stdout"と書き込まれ、stderr.txtには"stderr"と書き込まれます。
-
- | C/C++
-
- 0 Comment |
- 0 Trackback |
2010年03月13日
C++のファイル入出力
C++を使っていても、ファイルの処理はCのfopenなどで行っている人も結構いると思います。私もそうです。ですが、C++のファイル処理はCのそれより便利で安全な場合があります。今回は、簡単な出力と入力について説明します。
ファイルに出力するには、ofstreamクラスを使用します。テキストファイルのtest.txtに1〜10までの数字を書き込むプログラムを示します。
ofstreamクラスのコンストラクタの引数にファイル名を指定します。コンストラクタには、ファイルモードも指定できます。
ofstreamクラスのコンストラクタで開かれたファイルには、<<演算子で書き込むことができます。書き込む内容が数値でも文字列でも同じように書き込めます。
ファイルと閉じる処理はデストラクタで呼び出されるので、明示的に記述する必要はありません。明示的に閉じる場合は、メンバ関数のclose()を呼びます。
ファイルを読み込む場合は、ifstreamクラスを使います。先ほどの例で、1〜10までの数字を書き込んだtest.txtの内容を読み込む処理を追加したプログラムを示します。
ifstreamクラスのコンストラクタにファイル名を指定して、ファイルを開きます。
whileループでファイルの内容をtextに読み込んでいます。getline関数は、ファイルから1行分だけ読み込んで、引数に指定されたバッファ(例ではstringクラスのtext)にコピーする処理を行います。例では、読み込みが失敗した場合や終端に達するまで読み込みを続けます。
このプログラムを実行すると、
1
2
3
4
5
6
7
8
9
10
と表示されます。
1.ファイルへ書き込む
ファイルに出力するには、ofstreamクラスを使用します。テキストファイルのtest.txtに1〜10までの数字を書き込むプログラムを示します。
#include <fstream>
using namespace std;
int main()
{
ofstream fs1("test.txt");
for (int i = 0; i < 10; i++) {
fs1 << (i+1) << endl;
}
return 0;
}
using namespace std;
int main()
{
ofstream fs1("test.txt");
for (int i = 0; i < 10; i++) {
fs1 << (i+1) << endl;
}
return 0;
}
ofstreamクラスのコンストラクタの引数にファイル名を指定します。コンストラクタには、ファイルモードも指定できます。
ofstreamクラスのコンストラクタで開かれたファイルには、<<演算子で書き込むことができます。書き込む内容が数値でも文字列でも同じように書き込めます。
ファイルと閉じる処理はデストラクタで呼び出されるので、明示的に記述する必要はありません。明示的に閉じる場合は、メンバ関数のclose()を呼びます。
2.ファイルを読み込む
ファイルを読み込む場合は、ifstreamクラスを使います。先ほどの例で、1〜10までの数字を書き込んだtest.txtの内容を読み込む処理を追加したプログラムを示します。
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ofstream fs1("test.txt");
for (int i = 0; i < 10; i++) {
fs1 << (i+1) << endl;
}
fs1.close();
ifstream fs2("test.txt");
string text;
while ( getline(fs2, text) ) {
cout << text << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
ofstream fs1("test.txt");
for (int i = 0; i < 10; i++) {
fs1 << (i+1) << endl;
}
fs1.close();
ifstream fs2("test.txt");
string text;
while ( getline(fs2, text) ) {
cout << text << endl;
}
return 0;
}
ifstreamクラスのコンストラクタにファイル名を指定して、ファイルを開きます。
whileループでファイルの内容をtextに読み込んでいます。getline関数は、ファイルから1行分だけ読み込んで、引数に指定されたバッファ(例ではstringクラスのtext)にコピーする処理を行います。例では、読み込みが失敗した場合や終端に達するまで読み込みを続けます。
このプログラムを実行すると、
1
2
3
4
5
6
7
8
9
10
と表示されます。
-
- | C/C++
-
- 0 Comment |
- 0 Trackback |