Guest User

Untitled

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