2016-06-07 18 views
0

Um das Bitmap Bild 3mal größer zu skalieren, habe ich diesen Code implementiert und Löcher gefunden. Ich entschied mich dafür, bilineare Interpolation zu verwenden und diese oben sind der Code, der den nächsten Pixel patcht, dessen Gewicht wie dieser Code berechnet wird. Ausgabe [j * hInfo.biWidth + i] = Bild [3/2 * j * hInfo.biWidth + 3/1 * i].
Die Logik ist einfach, also dachte ich, es würde richtig funktionieren, ich war mir ziemlich sicher, aber das Ergebnis von Image sieht wie eine Wassermelone aus, wie ich mich fühle, bitte schau dir den Code an. Kommentare sind willkommen. danke fürs Lesen.C++, Bilineare Interpolation zum Ausbessern von Löchern auf der vergrößerten Bitmap Bild

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); 
} 
+0

'void main' war nie C oder C++ gültig. Es macht es für die Leser schwieriger, den Code zu kopieren und einzufügen, um ihn auszuprobieren, da nur ein häufig verwendeter Compiler dies akzeptiert und Anfänger schlechte Angewohnheiten lehren. Bitte geben Sie keinen Code mit 'void main' ein; korrigiert. –

+0

Formatieren Sie Ihren Code bitte mit * konsistentem Einzug *, bevor Sie ihn veröffentlichen. Kostenlose Tools wie AStyle können das für Sie tun. Auch viele Redakteure von Programmierern können das für Sie tun, aber das Beste ist, den Code während des Schreibens korrekt zu formatieren. Ich schlage vor, dass Sie jetzt den Code richtig einrücken und erneut einreichen. Ohne weitere Änderungen. –

+0

Es scheint, dass Sie 'Output [x] = Image [y]' gesetzt haben, d. H. Der interpolierte Wert wird nicht wirklich interpoliert, sondern ein anderer Punkt an einer anderen Stelle. Sollte es nicht so etwas wie "Output [x] = Bild [y] * (1/3) + Bild [z] * (2/3)" sein, dh "Image" sollte (mindestens) zweimal auf der rechten Seite erscheinen Seite? –

Antwort

0

Dank euch allen, ich habe endlich mit dem Code getan. ja, ich brauche das else nicht, wenn das schon durch eine for-loop-bedingung eingeschränkt ist.

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)Output[i*hInfo.biWidth+j-1]*2/3+(int)Output[i*hInfo.biWidth+j+2]*1/3; 
     } 
     else if(j%3 == 2) 
     { 
      Output[i*hInfo.biWidth+j] = (int)Output[i*hInfo.biWidth+j-1]*1/3 + (int)Output[hInfo.biWidth*i + (j-2)]*2/3; 
     } 

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