こんにちわ、Visual Studio 2005のフォームアプリケーションでプログラミングしているものです。複数枚の画像を一つの画像にしたいのですが、どうもあっているのかどうかわかりません。
たとえば、画像が9枚あって1枚目の一番左上の画素を[0-0,0]とすると、
[0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0]
[0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0]
[3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0]
[3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0]
[6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0]
[6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0]
-----------------+-----------------+------------------------
[0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1]
[0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1]
[3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1]
[3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1]
[6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1]
[6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1]
-----------------+-----------------+------------------------
[0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2]
[0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2]
[3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2]
[3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2]
[6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2]
[6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2]
といった感じにしようと思っています。
画像には配列を使っていてbmp[0]~[8]が9枚の画像を表し、picはbmp[0]~[8]の画像一枚に対してサイズが横3倍縦6倍の画像になるはずです。
自分でプログラムしたのですが、できた画像を拡大しても細かすぎてよくわからない状況です。
for ( y = 0; y < h; y += 6 ) {
for ( x = 0; x < w; x += 3 ) {
for( b = 0; b < 3; b++ ) {
for( a = 0; a < 3; a++ ) {
pic->SetPixel( x + a, y + (2 * b) , bmp[((2 * b) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
pic->SetPixel( x + a, y + (2 * b) , bmp[(((2 * b) + 1) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
}
}
}
}
以前に、同じような配置法なのですが横3倍縦3倍の合成画像として、
[0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0]
[3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0]
[6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0]
-----------------+-----------------+------------------------
[0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1]
[3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1]
[6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1]
-----------------+-----------------+------------------------
[0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2]
[3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2]
[6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2]
の配置プログラムとして、
for ( y = 0; y < h; y += 3 ) {
for ( x = 0; x < w; x += 3 ) {
for( b = 0; b < 3; b++ ) {
for( a = 0; a < 3; a++ ) {
pic->SetPixel( x + a, y + b , bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 3 ) );
}
}
}
}
との回答をいただいたので、これを参考に作ってみたのですが・・・。
説明が下手でわかりにくいかもしれませんが、お分かりの方がいましたらご教授お願いします。
No.2ベストアンサー
- 回答日時:
> pic->SetPixel( x + a, y + (2 * b) , bmp[((2 * b) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
> pic->SetPixel( x + a, y + (2 * b) , bmp[(((2 * b) + 1) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
間違ってる。
偶数ラインと奇数ラインは、同じbmpから同じデータを持って来るはず。
なので、3つ目の引数は、2行とも同じにならないとおかしい。
そして「縦が6倍でも、縦が3倍でも、持って来る方法は同じ」じゃないといけない(但し、yの増加が3から6になってるので、そこだけ変更しないといけない)
また「横は変わってない」「持って来る方法は同じ」なのだから「縦3倍と縦6倍の時で、1番目と3番目の引数は同じ」にならないとならない。
つまり「変えるは2番目の引数だけ」になる。
3倍の時が
pic->SetPixel( x + a, y + b , bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 3 ) );
だったのなら、6倍の時は「2番目の引数だけ変える」のだから偶数ラインは
pic->SetPixel( x + a, ???, bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
になる筈。
奇数ラインは偶数ラインの1ライン下だから
pic->SetPixel( x + a, ??? + 1, bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
になる筈。
で、6倍のプログラムは、yは6づつ増えてて、bは1づつ増えてる。
y、b、偶数ラインの位置、奇数ラインの位置を表にすると
y b 偶数ラインの位置 奇数ラインの位置
0 0 0 1
0 1 2 3
0 2 4 5
6 0 6 7
6 1 8 9
6 2 10 11
12 0 12 13
12 1 14 15
12 2 16 17
となる。
この表に合うように「???」の式、「??? + 1」の式を書けば良い事になる。
すると「???」は「y + b * 2」だと判る。
上記を踏まえて書き直すと
for ( y = 0; y < h; y += 6 ) {
for ( x = 0; x < w; x += 3 ) {
for( b = 0; b < 3; b++ ) {
for( a = 0; a < 3; a++ ) {
pic->SetPixel( x + a, y + b * 2, bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
pic->SetPixel( x + a, y + b*2+1, bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );
}
}
}
}
となる。
しかし「同じデータを2度取り出す」のだから「取り出すのは1回」で良い筈。
従って
TColor col;
for ( y = 0; y < h; y += 6 ) {
for ( x = 0; x < w; x += 3 ) {
for( b = 0; b < 3; b++ ) {
for( a = 0; a < 3; a++ ) {
col = bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 );
pic->SetPixel( x + a, y + b * 2, col);
pic->SetPixel( x + a, y + b*2+1, col);
}
}
}
}
とすれば良い。
分かりやすい説明ありがとうございます。
拡大してみると、ちゃんとした画像ができているのがハッキリわかりました。
縦だけではなくて、横も変えてみた結果うまくいきました。
ありがとうございます。
No.1
- 回答日時:
元が9枚しかない画像で24倍の画像を作るのでしょうか?
3x3ならば9倍ですから9枚の画像から生成しても隙間は出来ません
元が2x2ぐらいのマトリックスでどのように配置するのか提示してみましょう
回答ありがとうございます。
縦を2倍にして、横はそのままの1倍にしようとしていました。
なので結果的には元画像(例えばbmp[0])の縦6倍、横3倍の画像を作ろうとしていたわけです。
縦に同じ画像の画素を2つづつ配置しています。
やっぱり、説明わかりにくかったですね・・・すみません。
今回は別の方に詳しい説明をいただいた結果画像がしっかり生成されました。
せっかく回答いただいたのにすみません、いつもありがとうございます^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 任意の置換を互換の積で表すプログラム 4 2022/11/13 19:10
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) エクセル VBA セルの結合 2 2022/09/07 11:48
- 工学 画像はテイラー展開の公式です。 <マクローリン展開> f(z)=Σ_{n=-∞~∞}a(n)(z-a 1 2022/09/01 22:56
- 数学 2次不等式の問題で 2 2022/04/08 18:36
- 数学 任意の置換を互換の積で表すことについて 2 2022/11/07 22:31
- 数学 面積分の問題について 1 2022/06/19 23:20
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- 数学 tan(z)のローラン展開は tan(z)=-1/(z-π/2)+a(2) (z-π/2)^2+・・ 5 2023/06/02 20:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCを使った画像認証マク...
-
UWSCの色判定
-
uwcs のマクロで画像認識をして...
-
UWSCでループ処理がうまくいき...
-
UWSC 画像認識で条件分岐
-
Pythonでgif画像が上手く作れない
-
こんなことてしますか??
-
C# Excelのsheetに表示された...
-
UWSC 画像判定と条件分岐について
-
uwscの画像認識に失敗します。
-
UWSC「画像が無い場合」
-
ImageMagickでgif画像の一部が...
-
vb.net 画像の透過について
-
「using Windows」でエラーが出る
-
uwsc画像認識のあいまい判定に...
-
uwscで画像がうまく認識できない
-
UWCSでのランダムクリック入力...
-
uwscについて質問です。
-
uwscについて質問です。
-
uwscについての質問です。 画面...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【EXCEL VBA】ダブルクリックで...
-
こんなことてしますか??
-
Pythonでgif画像が上手く作れない
-
Excel ユーザーフォームで表示...
-
VBA シート毎に画像挿入
-
生成AI画像について
-
EXCEL VBA 複数のImageコントロ...
-
HTMLで画像をポップアップで表...
-
UWSCの色判定
-
UWSC 画像判定と条件分岐について
-
jQuery . プログラミング 助け...
-
VBAのユーザーフォームのイメー...
-
背景画像の繰り返しについて
-
jqueryスライダーを2段でスライ...
-
vb.net 画像の透過について
-
【WPF】画像の切り替え
-
「using Windows」でエラーが出る
-
画像処理したBitmapをピクチャ...
-
スマホでサイトの画像を長押し→...
-
UWSC 画像認識で条件分岐
おすすめ情報