http://csharpimage.blog60.fc2.com/blog-entry-18. …
をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、
rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。
24bppのRawファイル(RGB)を拡大縮小しようとしています。
rescale[i+j] =layer[(int)xpos+(int)ypos];の
layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。
layer:24bppRawを読み込むメモリ
アドバイスお願い致します。m(___)m
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
// 拡大縮小後の画像サイズ
int hxSize=Common_Data_Raw->width_rescale;
int hySize=Common_Data_Raw->height_rescale;
// 拡大縮小用
int xSize=width;
int ySize=height;
double xpos, ypos;
double hokanX = (double)xSize / hxSize;
double hokanY = (double)ySize / hySize;
unsigned char *layer,*rescale;
//読み込み
layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
fread(&layer[0],sizeof(unsigned char),3*width*height,fpt);
//拡大縮小後のサイズ
rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char));
ypos = 0.0;
for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize)
{
xpos = 0.0;
for (int j=0;j<3*hxSize;j+=3)
{
// 単純補間・間引き
rescale[i+j] =layer[(int)xpos+(int)ypos];
rescale[i+j+1]=layer[(int)xpos, (int)ypos];
rescale[i+j+2]=layer[(int)xpos, (int)ypos];
xpos += hokanX;
}
ypos += hokanY;
}
_wfopen_s(&fpt_output,L"output.raw",L"wb");
fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output);
fclose(fpt);
fclose(fpt_output);
free(layer);
free(rescale);
return 0;
No.1ベストアンサー
- 回答日時:
二次元配列を使っている元のプログラムのrescaleから、一次元配列のこのプログラムにするのにどうしましたか?
rescale[x,y] を rescale[ y * hxsize + x ]にしてますよね?
( 実際には、RGB3プレーン分で 3*(i * hxsize + j)ですが)
同じように、layer[x.y]は layer[y * width +x]です
(同様に3プレーンで3倍です)
注意しなければいけないのは、yposがdoubleである点です。
小数点以下があると、 その分だけ横にずれてしまいます。なので、*widthの前にintにしておく必要があります
rescale[i+j] =layer[((int)xpos+((int)ypos)* width)*3];
rescale[i+j+1] =layer[((int)xpos+((int)ypos)* width)*3+1];
rescale[i+j+2] =layer[((int)xpos+((int)ypos)* width)*3+2];
ちなみに、私なら
・画像の座標の計算をやりやすくために、0≦i<hySize,0≦j<hxSizeにする
・doubleを足していくと誤差がたまるので、その都度xpos,yposを計算する
ということで
for (int i = 0; i < hySize; ++ i)
{
ypos = i * hokanY ;
for (int j=0;j<hxSize; ++ j)
{
// 単純補間・間引き
xpos = j * hokanX;
int rescalep=3*(i * hxSize +j);
int layerp=3*((int)ypos * width+ (int)xpos);
rescale[rescalep] =layer[layerp];
rescale[rescalep+1] =layer[layerp+1];
rescale[rescalep+2] =layer[layerp+2];
}
}
はじめまして!こんにちは!
分かりやすい説明ありがとうございました!!
とってもよくわかりました。><
無事に実装できました☆
ありがとうございます!m(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
うちのカレーにはこれが入ってる!って食材ありますか?
カレーって同じルーから作っても、家庭によって入っているものや味が微妙に違っていて面白いですよね! 「我が家のカレーにはこれが入ってるよ!」 という食材や調味料はありますか?
-
画像の拡大・縮小
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
キーボードから自然数を入力し...
-
【C++】関数ポインタの使い方
-
C言語でlookupのような関数って?
-
c言語
-
int型とfloat型の演算結果
-
シグマ公式・・・C言語
-
if と配列の組み合わせ
-
C言語のポインタの問題の解答が...
-
(int *)の意味
-
C言語での奇数の和
-
C言語初心者です、、、お助けく...
-
比較回数と交換回数表示について
-
【C言語】円の面積を求めるプロ...
-
式は定数値が必要です」という...
-
atoi関数の自作
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
c言語の配列を使ってサイコロを...
-
【C++】関数ポインタの使い方
-
(マルチスレッド)_beginthrea...
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
C言語でlookupのような関数って?
-
数字列を3桁ごとにカンマで区切...
-
課題でつまってます・・・
-
read関数をノンブロッキングで...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
商と剰余を同時に求める(C言語)
-
std::set<int> で、ある値が何...
おすすめ情報