ビットマップ画像の10×10で区切って出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SIT

ビットマップ画像の10×10で区切って出力

#1

投稿記事 by SIT » 15年前

ビットマップ画像のRGBの値を出力するプログラムを書いたのですが、今度は画像の左下から10×10の画素ずつ区切って出力させるプログラムに直すことになりました。

計算式が難しいのでぜひともお知恵をお貸しください。


y2 = bi.biHeight;
x2 = bi.biWidth;

for ( y = 0; y <= y2; y++ ) {
for ( x = 0; x <= x2; x++ ) {
if((x % 10) == 0){y = y+1; x = 0; x3 = x;}
if((y % 10) == 0){x = 0; y3 = x;}


R = data[ y ][ x ].rgbtRed;
G = data[ y ][ x ].rgbtGreen;
B = data[ y ][ x ].rgbtBlue;

printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);
}
}

さんざん悩んで今はこんな状態です。

Dixq (管理人)

Re:ビットマップ画像の10×10で区切って出力

#2

投稿記事 by Dixq (管理人) » 15年前

>>SITさん

こんにちは。
ソースコードはプレタグで字下げして投稿して下さいね。

さて、区切って出力するというのは具体的にどうするのですか?
値をprintfで表示すればいいのか、それとも個別にファイルに保存するのか・・。

また、yは数が多い方と少ない方、どちらが下ですか?
******** 参考までに *********
#include <stdio.h> 
#define H 200
#define W 100
int main(){
    int x,y;
    for(y=0; y<H; y+=10){
        for(x=0; x<W; x+=10){
            printf("区切った10x10の左上の座標は[%d,%d]\n",x,y);
        }
    }
    return 0;
}

SIT

Re:ビットマップ画像の10×10で区切って出力

#3

投稿記事 by SIT » 15年前

Dixq様説明がかなり曖昧で申し訳ありません。
まず画像の左下が(0,0)です。
y2 = bi.biHeight;
x2 = bi.biWidth;

for ( y = 0; y <= y2; y++ ) {
for ( x = 0; x <= x2; x++ ) {
R = data[ y ][ x ].rgbtRed;
G = data[ y ][ x ].rgbtGreen;
B = data[ y ][ x ].rgbtBlue;
printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);
}
}

こうすると画像の左下からすべての画素をprintfで出力できたのですが、今度は左下から10×10の画素ずつ区切ってすべての画素をprintfで出力するプログラムです。

SIT

Re:ビットマップ画像の10×10で区切って出力

#4

投稿記事 by SIT » 15年前

添付した画像でご説明すると①の中のすべての画素をprintfで出力します。
次に②の中のすべてを出力して③・④と同じ事して、画像の端まで行ったら⑤に進んで同じことをしていきます。

ただ画素を出力する画像のサイズが不明なので、
y2 = bi.biHeight; 
x2 = bi.biWidth; 

  for ( y = 0; y <= y2; y++ ) { 
       for ( x = 0; x <= x2; x++ ) {


上記のようにしてどんなサイズでも対応できるようにしています。

SIT

Re:ビットマップ画像の10×10で区切って出力

#5

投稿記事 by SIT » 15年前

for ( y = 0; y <= y2; y + 10 ) {
        for ( x = 0; x <= x2; x + 10 ){
/追加            for( yy = y; yy < y ; yy++){       
/追加                for( xx = x; xx < x ; xx++){
                        
                    R = data[ y ][ x ].rgbtRed;
                    G = data[ y ][ x ].rgbtGreen;
                    B = data[ y ][ x ].rgbtBlue;

                    printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);


                            }
                        }
                    }
                }
先ほどいじってみてこうなりました。
合っていると思うのですが実行しても何も表示されません・・・。

Libra

Re:ビットマップ画像の10×10で区切って出力

#6

投稿記事 by Libra » 15年前

for ( y = 0; y <= y2; y + 10 ) {

最初 y = 0



for( yy = y; yy < y ; yy++){

yy = y ・・・ yy = 0

yy < y → 0 < 0・・・yの値がどんな値でも条件を満たさない


ループの条件を満たしてないので、ループの中の処理に
入っていかないハズです。


あと、
for ( y = 0; y <= y2; y + 10 ) {

yに10を足すなら y+10 ではなく、 y+=10 じゃないと加算されません。
xについても同様で。

SIT

Re:ビットマップ画像の10×10で区切って出力

#7

投稿記事 by SIT » 15年前

y2 = bi.biHeight;
    x2 = bi.biWidth;


        for ( y = 0; y <= y2;  y = y + 10) {
            for ( x = 0; x <= x2; x = x + 10){
                for( h = y; h > y + 10; h++){
                    for( w = x; w > x + 10; w++){

                        
                        R = data[ y ][ x ].rgbtRed;
                        G = data[ y ][ x ].rgbtGreen;
                        B = data[ y ][ x ].rgbtBlue;

                        printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);



                                }
                            }
                        }    
                    }
Libraさん、ご指摘ありがとうございます。
書き直してみましたがまだうまくprintfで出ません・・。

non

Re:ビットマップ画像の10×10で区切って出力

#8

投稿記事 by non » 15年前

やりたいことがよく理解できてないので、間違っているかも知れませんが。
y2 = bi.biHeight; //縦の画素数
x2 = bi.biWidth; //横の画素数


for ( y = 0; y < y2;  y = y + 10) {
    for ( x = 0; x < x2; x = x + 10){
        for( h = y; h < y + 10 && h < y2; h++){
            for( w = x; w < x + 10 && w < x2; w++){

                R = data[ h ][ w ].rgbtRed;
                G = data[ h ][ w ].rgbtGreen;
                B = data[ h ][ w ].rgbtBlue;
                printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);

            }
        }
    }    
}

SIT

Re:ビットマップ画像の10×10で区切って出力

#9

投稿記事 by SIT » 15年前

Dixq様 Libra様 non様
説明が不明確で申し訳ありませんでした。
プログラムを以下のようにしたらうまくいけました。

ご迷惑とお手数を取らせてしまいすいません。
//RGB別に出力する
    for ( y = 0; y <= bi.biHeight; y++ ) {
        data[ y ] = (RGBTRIPLE *)((char*)buf + LineSize * y);
    }

        fread( buf, BufferSize, 1, fp );
        n1 = z1 + 10;
        n2 = w1 + 10;
            for ( y = z1; y < n1; y++ ) {
                for ( x = w1; x <= n2; x++) {

                    if(x >= n2){
                        x = n2;
                        n2 = n2 + 10;
                    }else if(y >= n1){
                        y = n1;
                        n1 = n1 + 10;
                    }

                    if(n2 > w2){
                        break;
                    }else if(n1 > z2){
                        break;
                    }
            
            
            R = data[ y ][ x ].rgbtRed;
            G = data[ y ][ x ].rgbtGreen;
            B = data[ y ][ x ].rgbtBlue;

            printf("Y軸:%d,X軸:%d, R:%d, G:%d, B:%d\n", y, x, R, G, B);


        }
    }
    
    
    return 0;

閉鎖

“C言語何でも質問掲示板” へ戻る