#include <stdio.h>
#include <stdlib.h>
int upside_down( const char * fname_s, const char * fname_t) {
FILE * fp_s = NULL ; // source file handler
FILE * fp_t = NULL ; // target file handler
unsigned int x,y; // for loop counter
unsigned int width, height; // image width, image height
unsigned char * image_s = NULL ; // source image array
unsigned char * image_t = NULL ; // target image array
unsigned int R, G, B; // color of R, G, B
unsigned int y_avg; // average of y axle
unsigned int y_t; // target of y axle
unsigned char header[ 54 ] = {
0x42 , // identity : B
0x4d , // identity : M
0 , 0 , 0 , 0 , // file size
0 , 0 , // reserved1
0 , 0 , // reserved2
54 , 0 , 0 , 0 , // RGB data offset
40 , 0 , 0 , 0 , // struct BITMAPINFOHEADER size
0 , 0 , 0 , 0 , // bmp width
0 , 0 , 0 , 0 , // bmp height
1 , 0 , // planes
24 , 0 , // bit per pixel
0 , 0 , 0 , 0 , // compression
0 , 0 , 0 , 0 , // data size
0 , 0 , 0 , 0 , // h resolution
0 , 0 , 0 , 0 , // v resolution
0 , 0 , 0 , 0 , // used colors
0 , 0 , 0 , 0 // important colors
} ;
unsigned int file_size; // file size
unsigned int rgb_raw_data_offset; // RGB raw data offset
fp_s = fopen ( fname_s, "rb" ) ;
if ( fp_s == NULL ) {
printf ( "fopen fp_s error\n " ) ;
return - 1 ;
}
// move offset to 10 to find rgb raw data offset
fseek ( fp_s, 10 , SEEK_SET ) ;
fread ( & rgb_raw_data_offset, sizeof ( unsigned int ) , 1 , fp_s) ;
// move offset to 18 to get width & height;
fseek ( fp_s, 18 , SEEK_SET ) ;
fread ( & width, sizeof ( unsigned int ) , 1 , fp_s) ;
fread ( & height, sizeof ( unsigned int ) , 1 , fp_s) ;
// move offset to rgb_raw_data_offset to get RGB raw data
fseek ( fp_s, rgb_raw_data_offset, SEEK_SET ) ;
image_s = ( unsigned char * ) malloc ( ( size_t ) width * height * 3 ) ;
if ( image_s == NULL ) {
printf ( "malloc images_s error\n " ) ;
return - 1 ;
}
image_t = ( unsigned char * ) malloc ( ( size_t ) width * height * 3 ) ;
if ( image_t == NULL ) {
printf ( "malloc image_t error\n " ) ;
return - 1 ;
}
fread ( image_s, sizeof ( unsigned char ) , ( size_t ) ( long ) width * height * 3 , fp_s) ;
y_avg = 0 + ( height- 1 ) ;
for ( y = 0 ; y ! = height; ++ y) {
for ( x = 0 ; x ! = width; ++ x) {
R = * ( image_s + 3 * ( width * y + x) + 2 ) ;
G = * ( image_s + 3 * ( width * y + x) + 1 ) ;
B = * ( image_s + 3 * ( width * y + x) + 0 ) ;
int num[ 10 ] ;
num[ 1 ] = R;
num[ 2 ] = G;
num[ 3 ] = B;
int max = 0 ;
for ( int j = 0 ; j < 2 ; ++ j)
{
if ( num[ j] > max)
max = num[ j] ;
}
int min = 255 ;
for ( int m = 0 ; m < 2 ; ++ m)
{
if ( num[ m] < min)
min = num[ m] ;
}
printf ( "%d%s%d%s%d%s%d%s%d\n " ,R,"_" ,G,"_" ,B,"_" ,min,"_" ,max) ;
y_t = y;
* ( image_t + 3 * ( width * y_t + x) + 2 ) = R;
* ( image_t + 3 * ( width * y_t + x) + 1 ) = G;
* ( image_t + 3 * ( width * y_t + x) + 0 ) = B;
}
}
// write to new bmp
fp_t = fopen ( fname_t, "wb" ) ;
if ( fp_t == NULL ) {
printf ( "fopen fname_t error\n " ) ;
return - 1 ;
}
// file size
file_size = width * height * 3 + rgb_raw_data_offset;
header[ 2 ] = ( unsigned char ) ( file_size & 0x000000ff ) ;
header[ 3 ] = ( file_size >> 8 ) & 0x000000ff ;
header[ 4 ] = ( file_size >> 16 ) & 0x000000ff ;
header[ 5 ] = ( file_size >> 24 ) & 0x000000ff ;
// width
header[ 18 ] = width & 0x000000ff ;
header[ 19 ] = ( width >> 8 ) & 0x000000ff ;
header[ 20 ] = ( width >> 16 ) & 0x000000ff ;
header[ 21 ] = ( width >> 24 ) & 0x000000ff ;
// height
header[ 22 ] = height & 0x000000ff ;
header[ 23 ] = ( height >> 8 ) & 0x000000ff ;
header[ 24 ] = ( height >> 16 ) & 0x000000ff ;
header[ 25 ] = ( height >> 24 ) & 0x000000ff ;
// write header
fwrite ( header, sizeof ( unsigned char ) , rgb_raw_data_offset, fp_t) ;
// write image
fwrite ( image_t, sizeof ( unsigned char ) , ( size_t ) ( long ) width *
I2luY2x1ZGUgPHN0ZGlvLmg+CgojaW5jbHVkZSA8c3RkbGliLmg+CgoKCiAgaW50IHVwc2lkZV9kb3duKGNvbnN0IGNoYXIgKmZuYW1lX3MsIGNvbnN0IGNoYXIgKmZuYW1lX3QpIHsKCiAgICBGSUxFICAgICAgICAgICpmcF9zID0gTlVMTDsgICAgLy8gc291cmNlIGZpbGUgaGFuZGxlcgoKICAgIEZJTEUgICAgICAgICAgKmZwX3QgPSBOVUxMOyAgICAvLyB0YXJnZXQgZmlsZSBoYW5kbGVyIAoKICAgIHVuc2lnbmVkIGludCAgeCx5OyAgICAgICAgICAgICAvLyBmb3IgbG9vcCBjb3VudGVyCgogICAgdW5zaWduZWQgaW50ICB3aWR0aCwgaGVpZ2h0OyAgIC8vIGltYWdlIHdpZHRoLCBpbWFnZSBoZWlnaHQKCiAgICB1bnNpZ25lZCBjaGFyICppbWFnZV9zID0gTlVMTDsgLy8gc291cmNlIGltYWdlIGFycmF5CgogICAgdW5zaWduZWQgY2hhciAqaW1hZ2VfdCA9IE5VTEw7IC8vIHRhcmdldCBpbWFnZSBhcnJheQoKICAgIHVuc2lnbmVkIGludCBSLCBHLCBCOyAgICAgICAgIC8vIGNvbG9yIG9mIFIsIEcsIEIKCiAgICB1bnNpZ25lZCBpbnQgeV9hdmc7ICAgICAgICAgICAgLy8gYXZlcmFnZSBvZiB5IGF4bGUKCiAgICB1bnNpZ25lZCBpbnQgeV90OyAgICAgICAgICAgICAgLy8gdGFyZ2V0IG9mIHkgYXhsZQoKICAgIAoKICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzU0XSA9IHsKCiAgICAgIDB4NDIsICAgICAgICAvLyBpZGVudGl0eSA6IEIKCiAgICAgIDB4NGQsICAgICAgICAvLyBpZGVudGl0eSA6IE0KCiAgICAgIDAsIDAsIDAsIDAsICAvLyBmaWxlIHNpemUKCiAgICAgIDAsIDAsICAgICAgICAvLyByZXNlcnZlZDEKCiAgICAgIDAsIDAsICAgICAgICAvLyByZXNlcnZlZDIKCiAgICAgIDU0LCAwLCAwLCAwLCAvLyBSR0IgZGF0YSBvZmZzZXQKCiAgICAgIDQwLCAwLCAwLCAwLCAvLyBzdHJ1Y3QgQklUTUFQSU5GT0hFQURFUiBzaXplCgogICAgICAwLCAwLCAwLCAwLCAgLy8gYm1wIHdpZHRoCgogICAgICAwLCAwLCAwLCAwLCAgLy8gYm1wIGhlaWdodAoKICAgICAgMSwgMCwgICAgICAgIC8vIHBsYW5lcwoKICAgICAgMjQsIDAsICAgICAgIC8vIGJpdCBwZXIgcGl4ZWwKCiAgICAgIDAsIDAsIDAsIDAsICAvLyBjb21wcmVzc2lvbgoKICAgICAgMCwgMCwgMCwgMCwgIC8vIGRhdGEgc2l6ZQoKICAgICAgMCwgMCwgMCwgMCwgIC8vIGggcmVzb2x1dGlvbgoKICAgICAgMCwgMCwgMCwgMCwgIC8vIHYgcmVzb2x1dGlvbiAKCiAgICAgIDAsIDAsIDAsIDAsICAvLyB1c2VkIGNvbG9ycwoKICAgICAgMCwgMCwgMCwgMCAgIC8vIGltcG9ydGFudCBjb2xvcnMKCiAgICB9OwoKICAgIAoKICAgIHVuc2lnbmVkIGludCBmaWxlX3NpemU7ICAgICAgICAgICAvLyBmaWxlIHNpemUKCiAgICB1bnNpZ25lZCBpbnQgcmdiX3Jhd19kYXRhX29mZnNldDsgLy8gUkdCIHJhdyBkYXRhIG9mZnNldAoKICAgIAoKICAgIGZwX3MgPSBmb3BlbihmbmFtZV9zLCAicmIiKTsKCiAgICBpZiAoZnBfcyA9PSBOVUxMKSB7CgogICAgICBwcmludGYoImZvcGVuIGZwX3MgZXJyb3JcbiIpOwoKICAgICAgcmV0dXJuIC0xOwoKICAgIH0KCiAgCgogICAgLy8gbW92ZSBvZmZzZXQgdG8gMTAgdG8gZmluZCByZ2IgcmF3IGRhdGEgb2Zmc2V0CgogICAgZnNlZWsoZnBfcywgMTAsIFNFRUtfU0VUKTsKCiAgICBmcmVhZCgmcmdiX3Jhd19kYXRhX29mZnNldCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDEsIGZwX3MpOwoKICAgIC8vIG1vdmUgb2Zmc2V0IHRvIDE4ICAgIHRvIGdldCB3aWR0aCAmIGhlaWdodDsKCiAgICBmc2VlayhmcF9zLCAxOCwgU0VFS19TRVQpOyAKCiAgICBmcmVhZCgmd2lkdGgsICBzaXplb2YodW5zaWduZWQgaW50KSwgMSwgZnBfcyk7CgogICAgZnJlYWQoJmhlaWdodCwgc2l6ZW9mKHVuc2lnbmVkIGludCksIDEsIGZwX3MpOwoKICAKCgkvLyBtb3ZlIG9mZnNldCB0byByZ2JfcmF3X2RhdGFfb2Zmc2V0IHRvIGdldCBSR0IgcmF3IGRhdGEKCiAgICBmc2VlayhmcF9zLCByZ2JfcmF3X2RhdGFfb2Zmc2V0LCBTRUVLX1NFVCk7CgogICAgICAKCiAgICBpbWFnZV9zID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoKHNpemVfdCl3aWR0aCAqIGhlaWdodCAqIDMpOwoKICAgIGlmIChpbWFnZV9zID09IE5VTEwpIHsKCiAgICAgIHByaW50ZigibWFsbG9jIGltYWdlc19zIGVycm9yXG4iKTsKCiAgICAgIHJldHVybiAtMTsKCiAgICB9CgogICAgICAKCiAgICBpbWFnZV90ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoKHNpemVfdCl3aWR0aCAqIGhlaWdodCAqIDMpOwoKICAgIGlmIChpbWFnZV90ID09IE5VTEwpIHsKCiAgICAgIHByaW50ZigibWFsbG9jIGltYWdlX3QgZXJyb3JcbiIpOwoKICAgICAgcmV0dXJuIC0xOwoKICAgIH0KCiAgICAKCiAgICBmcmVhZChpbWFnZV9zLCBzaXplb2YodW5zaWduZWQgY2hhciksIChzaXplX3QpKGxvbmcpd2lkdGggKiBoZWlnaHQgKiAzLCBmcF9zKTsKCiAgICAKCiAgICAKCiAgICB5X2F2ZyA9IDAgKyAoaGVpZ2h0LTEpOwoKICAgIAoKICAgIGZvcih5ID0gMDsgeSAhPSBoZWlnaHQ7ICsreSkgewoKICAgICAgZm9yKHggPSAwOyB4ICE9IHdpZHRoOyArK3gpIHsKCiAgICAgICAgUiA9ICooaW1hZ2VfcyArIDMgKiAod2lkdGggKiB5ICsgeCkgKyAyKTsKCiAgICAgICAgRyA9ICooaW1hZ2VfcyArIDMgKiAod2lkdGggKiB5ICsgeCkgKyAxKTsKCiAgICAgICAgQiA9ICooaW1hZ2VfcyArIDMgKiAod2lkdGggKiB5ICsgeCkgKyAwKTsKCiAgICAgICAgCgoJCWludCBudW1bMTBdOwoKCQludW1bMV0gPSBSOwoKCQludW1bMl0gPSBHOwoKCQludW1bM10gPSBCOwoKICAgICAgICAKCgkJaW50IG1heCA9IDA7CgoJCQoKCQkKCgkJCgoJCQlmb3IoaW50IGogPSAwOyBqIDwgMjsgKytqKQoKCQkJewoKCQkJCWlmIChudW1bal0gPiBtYXgpCgoJCQkJICBtYXggPSBudW1bal07CgoJCQkJCgoKCgkJCX0KCgkJCgoJCQoKCQlpbnQgbWluID0gMjU1OwoKCQkKCgkJCgoJCQoKCQkJZm9yKGludCBtID0gMDsgbSA8IDI7ICsrbSkKCgkJCXsKCgkJCQlpZiAobnVtW21dIDwgbWluKQoKCQkJCSAgbWluID0gbnVtW21dOwoKCQkJCQoKCQkJfQoKCQkKCgkJCgoJCQoKCQlwcmludGYoIiVkJXMlZCVzJWQlcyVkJXMlZFxuIixSLCJfIixHLCJfIixCLCJfIixtaW4sIl8iLG1heCk7IAoKCgoJCQoKICAgICAgICAJCgoJCQoKCQl5X3QgPSB5OwoKICAgICAgICAKCiAgICAgICAgKihpbWFnZV90ICsgMyAqICh3aWR0aCAqIHlfdCArIHgpICsgMikgPSBSOwoKICAgICAgICAqKGltYWdlX3QgKyAzICogKHdpZHRoICogeV90ICsgeCkgKyAxKSA9IEc7CgogICAgICAgICooaW1hZ2VfdCArIDMgKiAod2lkdGggKiB5X3QgKyB4KSArIDApID0gQjsKCgoKCgoJCQoKCQkKCgkJCgoKCgoKCgoKCgoKICAgICAgfQoKICAgIH0KCgoKCgoKCgoKCgogIAoKICAgIC8vIHdyaXRlIHRvIG5ldyBibXAKCiAgICBmcF90ID0gZm9wZW4oZm5hbWVfdCwgIndiIik7CgogICAgaWYgKGZwX3QgPT0gTlVMTCkgewoKICAgICBwcmludGYoImZvcGVuIGZuYW1lX3QgZXJyb3JcbiIpOwoKICAgICAgICByZXR1cm4gLTE7CgogICAgICB9CgogICAgICAgCgogICAgIC8vIGZpbGUgc2l6ZSAgCgogICAgIGZpbGVfc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMyArIHJnYl9yYXdfZGF0YV9vZmZzZXQ7CgogICAgIGhlYWRlclsyXSA9ICh1bnNpZ25lZCBjaGFyKShmaWxlX3NpemUgJiAweDAwMDAwMGZmKTsKCiAgICAgaGVhZGVyWzNdID0gKGZpbGVfc2l6ZSA+PiA4KSAgJiAweDAwMDAwMGZmOwoKICAgICBoZWFkZXJbNF0gPSAoZmlsZV9zaXplID4+IDE2KSAmIDB4MDAwMDAwZmY7CgogICAgIGhlYWRlcls1XSA9IChmaWxlX3NpemUgPj4gMjQpICYgMHgwMDAwMDBmZjsKCiAgICAgCgogICAgIC8vIHdpZHRoCgogICAgIGhlYWRlclsxOF0gPSB3aWR0aCAmIDB4MDAwMDAwZmY7CgogICAgIGhlYWRlclsxOV0gPSAod2lkdGggPj4gOCkgICYgMHgwMDAwMDBmZjsKCiAgICAgaGVhZGVyWzIwXSA9ICh3aWR0aCA+PiAxNikgJiAweDAwMDAwMGZmOwoKICAgICBoZWFkZXJbMjFdID0gKHdpZHRoID4+IDI0KSAmIDB4MDAwMDAwZmY7CgogICAgIAoKICAgICAvLyBoZWlnaHQKCiAgICAgaGVhZGVyWzIyXSA9IGhlaWdodCAmMHgwMDAwMDBmZjsKCiAgICAgaGVhZGVyWzIzXSA9IChoZWlnaHQgPj4gOCkgICYgMHgwMDAwMDBmZjsKCiAgICAgaGVhZGVyWzI0XSA9IChoZWlnaHQgPj4gMTYpICYgMHgwMDAwMDBmZjsKCiAgICAgaGVhZGVyWzI1XSA9IChoZWlnaHQgPj4gMjQpICYgMHgwMDAwMDBmZjsKCiAgIAoKICAgLy8gd3JpdGUgaGVhZGVyCgogICBmd3JpdGUoaGVhZGVyLCBzaXplb2YodW5zaWduZWQgY2hhciksIHJnYl9yYXdfZGF0YV9vZmZzZXQsIGZwX3QpOwoKICAgLy8gd3JpdGUgaW1hZ2UKCiAgICAgZndyaXRlKGltYWdlX3QsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKHNpemVfdCkobG9uZyl3aWR0aCAqIA==