Advertisement
Guest User

Untitled

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