0

ビットマップ イメージを 3 倍に拡大するために、このコードを実装し、穴を見つけました。双一次補間を使用することにしました。上記は、このコードのように重みが計算される最も近いピクセルにパッチを適用するコードです。出力[j*hInfo.biWidth+i] =画像[3/2*j*hInfo.biWidth + 3/1*i].
ロジックは単純なので、ちゃんと動くと思っていたのですが、イメージの結果は私の感じたスイカのように見えます。コードを見てください。どんなコメントでも大歓迎です。読んでくれてありがとう。

void main() 
{
BITMAPFILEHEADER hf;
BITMAPINFOHEADER hInfo;
RGBQUAD hRGB[256];
FILE *fp;
fp = fopen("input.bmp", "rb");
if(fp == NULL) return;
fread(&hf, sizeof(BITMAPFILEHEADER), 1, fp);
fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, fp);
fread(hRGB, sizeof(RGBQUAD), 256, fp);
hInfo.biWidth *=3;
hInfo.biHeight *=3;
int ImgSize = hInfo.biWidth * hInfo.biHeight;

BYTE *Image = (BYTE *) malloc(ImgSize);
BYTE *Output = (BYTE *)malloc(ImgSize);
fread(Image, sizeof(BYTE), ImgSize, fp);
fclose(fp);
double Sx, Sy;
scanf("%lf", & Sx);// scaling factor x : 3
scanf("%lf", & Sy);// scaling factor y : 3

for(int i= 0 ; i < hInfo.biHeight; i++){
    for(int j=0; j < hInfo.biWidth; j++){
        if(j*Sx < hInfo.biWidth && i*Sy<hInfo.biHeight)

Output[(int)(i*Sy)*hInfo.biWidth+(int)(j*Sx)] = Image[i*hInfo.biWidth + j];
    }
}


// horizontally executed first. 

for(int i= 0 ; i < hInfo.biHeight; i++){
    for(int j=0; j < hInfo.biWidth; j++){
        if( j%3 == 1)
        {
            Output[i*hInfo.biWidth+j] = (int)Image[( (hInfo.biWidth*(1/3) + j+2) + ( hInfo.biWidth* (2/3) + (j-1) ) )]; 
        }
        else if( j%3 == 2 )
        {
            Output[i*hInfo.biWidth+j] = (int)Image[( (hInfo.biWidth*(2/3) + j+1) + ( hInfo.biWidth* (1/3) + (j-2) ) )];
        }
        else if(  j%3 ==1 && j+2 >= hInfo.biWidth)
        {
            Output[i*hInfo.biWidth+j] = Image[i*hInfo.biWidth + (j-2)] ;
        }
        else if(  j%3 ==2 && j+1 >= hInfo.biWidth)
        {
            Output[i*hInfo.biWidth+j] = Image[i*hInfo.biWidth + (j-2)] ;
        }

    }
}


// vertically executed last 
for(int j= 0 ; j < hInfo.biWidth; j++){

    for(int i=0; i < hInfo.biHeight; i++){

        if( j%3 == 1)
        {
            Output[j*hInfo.biWidth+i] = Image[hInfo.biWidth*(1/3) + (i+2) + hInfo.biWidth* (2/3) + (i-1);   
        }
        else if( j%3 == 2 )
        {
            Output[j*hInfo.biWidth+i] = Image[hInfo.biWidth*(2/3) + (i+1) + hInfo.biWidth* (1/3) + (i-2)];
        }
        else if(  j%3 ==1 && j+2>=hInfo.biWidth)
        {
            Output[j*hInfo.biWidth+i] = Image[j*hInfo.biWidth + (i-2)] ;
        }
        else if(  j%3 ==2 && j+1>=hInfo.biWidth)
        {
            Output[j*hInfo.biWidth+i] = Image[j*hInfo.biWidth + (i-2)] ;
        }

    }
}

fp = fopen("output.bmp", "wb");
fwrite(&hf, sizeof(BYTE), sizeof(BITMAPFILEHEADER), fp);
fwrite(&hInfo, sizeof(BYTE), sizeof(BITMAPINFOHEADER), fp);
fwrite(hRGB, sizeof(RGBQUAD), 256, fp);
fwrite(Output, sizeof(BYTE),ImgSize, fp);
fclose(fp);
free(Image);
free(Output);
}
4

1 に答える 1