[WP]no.016 画像回転


以前に作成した簡易bmp読み書きライブラリ
http://shonen9th.blog.fc2.com/blog-entry-54.html


入力された画像を中心を原点として任意角度に回転させます。滅茶苦茶簡単。


画像を読み込み、画像サイズを得る。

四隅の座標が得られるので、回転行列を利用して回転。

変換後の四隅の座標から、出力画像が取るべき画像サイズを求める。

出力画像の各ピクセルに対して
 ピクセルの座標を 回転行列の逆行列を利用して逆変換。
 その座標が元の画像の外であればbgcolorで、そうでなければ対応する色を置く。


回転行列は直行行列なので、逆行列=転置行列。

続きを読む

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : C 画像解析

C言語によるBMP編集 その2

読み込もうと思っていたbmp画像がパレットタイプだったので適応。

詳細は前の記事。
http://shonen9th.blog.fc2.com/blog-entry-53.html

今回は構造体を定義してあります…一部外道な手段を取っていますが。


2015/09/07追記
良く考えたら256色bmpしか読み込めない。if文で弾いておきました。

続きを読む

テーマ : プログラミング
ジャンル : コンピュータ

tag : C 画像解析

[WP]no.015 C言語でbmp編集

数時間くらいで作成。初めてgoto使った気がします。


画像解析も、画像を読み込めなければ意味がありません。
というわけで、ビットマップファイルbmpの読み込みと保存。

windowsでもlinuxでもコンパイルできるはず。


bmpファイルヘッダ構造体を定義せずに書いていったのですが、やはり読みにくい。
簡易的に読み書きできればいいやー感でやりました。ごめんなさい

しかも構造体で書いた方が動作早そうじゃない?


こちらのサイトにBMPのバイナリ構造についての解説があります。

ルーチェ's Homepage
http://www.ruche-home.net/program/bmp/struct


こちらのサイトに沿って記述し、また出力ファイルは、適当なビュアーで表示できたので問題ないでしょう。

wikipediaにもありました(2015/09/04)。

wikipedia
https://ja.wikipedia.org/wiki/Windows_bitmap



BMPファイルにはさまざまなパターンがあり、無圧縮やRLE圧縮、jpeg圧縮されたもの、パレットを持つもの等があります。
当然、全てのパターンに対応すべきですが、ここでは「24bit無圧縮」のみとします。他はエラーで弾くようにします。

もちろん、出力も「24bit無圧縮」のみです。ファイルが大きくなるので、サイズは320x240か256x256に抑えるべきです。


ファイルが読み込めなかった場合、そのbmpファイルがパレットを持っているかどうか(256色bmp等)確かめてください。
windows標準のmspaintで「24bit無圧縮」に変換できます。


2015/09/06 改良しました。
http://shonen9th.blog.fc2.com/blog-entry-54.html


…実用性を求めるならば、C++のオープンソースライブラリとか

libbmp24
http://doscoy.github.io/libbmp24/

続きを読む

テーマ : プログラミング
ジャンル : コンピュータ

tag : C 画像解析

malloc・newで確保したポインタを返す関数の作成時に気を付けるべきこと

関数内でmallocするときの注意
http://oswald.hatenablog.com/entry/20081210/1228920110

この記事と全く同じミスをしてしまったのですが、対策として返り値を使用するといった手段を挙げているので、「リスク回避」ですね。
解決にはなってないような気がします。

もう少し考え直してみる。

#include <stdio.h>
#include <stdlib.h>

void alc5(int *p){
int i;
p = (int *)malloc (sizeof(int)*5);
for (i=0;i<5;i++)p[i]=i*i;
}
int main (void){
int *p,i;

alc5(p);
for (i=0;i<5;i++) printf("%d\n",p[i]);

free (p);
return 0;
}

セグメンテーションエラー引き起こします。何故か。

alc5(p);

ポインタ変数の中身のコピーを渡してます。
ポインタ変数の中身を書き換えたいなら、ポインタ変数のポインタのコピーを渡すべき。

「ポインタのポインタ」または「ポインタの参照型(C++)」が正解。

#include <stdio.h>
#include <stdlib.h>

void alc5(int **p){
int i;
*p = (int *)malloc (sizeof(int)*5);
for (i=0;i<5;i++) (*p)[i]=i*i;
}
int main (void){
int *p,i;

alc5(&p);
for (i=0;i<5;i++) printf("%d\n",p[i]);

free (p);
return 0;
}

テーマ : プログラミング
ジャンル : コンピュータ

tag : C

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++JavaRubyUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1437位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
245位
アクセスランキングを見る>>