ketan18710

Untitled

Feb 4th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 0 0
  1. /**
  2. * Copies a BMP piece by piece, just because.
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. #include "bmp.h"
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12. // ensure proper usage
  13. if (argc != 4)
  14. {
  15. fprintf(stderr, "Usage: ./copy infile outfile\n");
  16. return 1;
  17. }
  18.  
  19. // remember filenames
  20. char *infile = argv[2];
  21. char *outfile = argv[3];
  22. int n = atoi(argv[1]);
  23. // open input file
  24. FILE *inptr = fopen(infile, "r");
  25. if (inptr == NULL)
  26. {
  27. fprintf(stderr, "Could not open %s.\n", infile);
  28. return 2;
  29. }
  30.  
  31. // open output file
  32. FILE *outptr = fopen(outfile, "w");
  33. if (outptr == NULL)
  34. {
  35. fclose(inptr);
  36. fprintf(stderr, "Could not create %s.\n", outfile);
  37. return 3;
  38. }
  39. // read infile's BITMAPFILEHEADER
  40. BITMAPFILEHEADER bf;
  41. fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
  42.  
  43. // read infile's BITMAPINFOHEADER
  44. BITMAPINFOHEADER bi;
  45. fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
  46.  
  47. // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
  48. if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 ||
  49. bi.biBitCount != 24 || bi.biCompression != 0)
  50. {
  51. fclose(outptr);
  52. fclose(inptr);
  53. fprintf(stderr, "Unsupported file format.\n");
  54. return 4;
  55. }
  56. int opadding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  57.  
  58. bi.biWidth*=n;
  59. bi.biHeight*=n;
  60.  
  61. // determine padding for scanlines
  62. int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
  63. bi.biSizeImage = ((sizeof(RGBTRIPLE)*bi.biWidth)+ padding)*abs(bi.biHeight);
  64. bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  65. // write outfile's BITMAPFILEHEADER
  66. fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
  67. // write outfile's BITMAPINFOHEADER
  68. fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
  69. // iterate over infile's scanlines
  70. RGBTRIPLE *arr = (RGBTRIPLE *)malloc((bi.biWidth/n) * (bi.biWidth/n) * sizeof(RGBTRIPLE)),*x;
  71. x = arr ;
  72. for(int a=0;a<(bi.biWidth/n);a++)
  73. {
  74. for(int b=0;b<(bi.biWidth/n);b++)
  75. {
  76. fread(arr, sizeof(RGBTRIPLE), 1, inptr);
  77. arr++;
  78. }
  79. fseek(inptr, opadding, SEEK_CUR);
  80. }
  81. arr = x;
  82. for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight;)
  83. { for(int b=0;b<n;b++)
  84. { if(b!=0)
  85. {
  86. arr-= bi.biWidth;
  87. }
  88. // iterate over pixels in scanline
  89. for (int j = 0; j < bi.biWidth; )
  90. {
  91. // temporary storage
  92. for(int a=0;a<n;a++)
  93. {// write RGB triple to outfile
  94. fwrite(arr, sizeof(RGBTRIPLE), 1, outptr);
  95. j++;
  96. }
  97. arr++;
  98. }
  99.  
  100. // then add it back (to demonstrate how)
  101. for (int k = 0; k < padding; k++)
  102. {
  103. fputc(0x00, outptr);
  104. }
  105. i++;
  106. }
  107. }
  108.  
  109. // close infile
  110. fclose(inptr);
  111.  
  112. // close outfile
  113. fclose(outptr);
  114.  
  115. // success
  116. return 0;
  117. }
Add Comment
Please, Sign In to add comment