BMPファイルの出力

概要

BMPファイルを出力するクラスです。
SystemVerilogで記述をしています。

動作確認

ツール バージョン 結果
ncverilog 06.11-s004 OK
VCS-MX A-2008.09 OK

テストコード

256x256のビットマップファイルを3つ出力します。

  1. program make_bitmap;
  2. `include "bitmap_data.sv"
  3. initial begin
  4. bitmap_data bmp1,bmp2,bmp3;
  5.  
  6. bmp1=new(256,256);
  7. bmp2=new(256,256);
  8. bmp3=new(256,256);
  9. for(int y=0;y<256;y++)begin
  10. for(int x=0;x<256;x++)begin
  11. byte r;
  12. byte g;
  13. byte b;
  14. r = x;
  15. g = y;
  16. b = ((128-x)*(128-x)+(128-y)*(128-y))>>6;
  17. bmp1.set_dot(x,y,r,0,0);
  18. bmp2.set_dot(x,y,0,g,0);
  19. bmp3.set_dot(x,y,0,0,b);
  20. end
  21. end
  22.  
  23. bmp1.file_write("r.bmp");
  24. bmp2.file_write("g.bmp");
  25. bmp3.file_write("b.bmp");
  26. end
  27. endprogram
  28.  

ソースコード

  1. `ifndef __BITMAP_DATA__
  2. `define __BITMAP_DATA__
  3.  
  4. class bitmap_data;
  5. //===============================================================
  6. // typedef
  7. //---------------------------------------------------------------
  8. // little endian -> after byte data is MSB
  9. typedef struct packed {
  10.   shortint unsigned bfType ; //
  11.   int unsigned bfSize ; //
  12.   shortint unsigned bfReserved1; //
  13.   shortint unsigned bfReserved2; //
  14.   int unsigned bfOffBits ; //
  15.   } BITMAP_FILE_HEADER; // 14 byte
  16.  
  17. typedef struct packed {
  18.   int unsigned biSize ; // info header size(byte)
  19.   int biWidth ; // picture width(pixel)
  20.   int biHeight ; // picture height(pixel)
  21.   shortint unsigned biPlanes ; // plane num
  22.   shortint unsigned biBitCount ; // data size(bit) par 1 pixel {1/4/8/24/32}
  23. int unsigned biCompression ; // compression type 0:none 1:RLE8 2:RLE4 3:bitFields
  24. int unsigned biSizeImage ; // pixel data size(byte)
  25. int biXPixPerMeter; // H dpi
  26. int biYPixPerMeter; // V dpi
  27. int unsigned biClrUsed ; // palette depth
  28. int unsigned biClrImporant ; // important palette index
  29. } BITMAP_INFO_HEADER; // 40 byte
  30.  
  31. // picture data is Left_Bottom -> Right_Top
  32. typedef struct packed {
  33.   byte unsigned rgbBlue;
  34.   byte unsigned rgbGreen;
  35.   byte unsigned rgbRed;
  36.   byte unsigned rgbReserved;
  37.   } RGB_QUAD;
  38. //===============================================================
  39. // member
  40. //---------------------------------------------------------------
  41. BITMAP_FILE_HEADER file_header;
  42. BITMAP_INFO_HEADER info_header;
  43. //RGB_QUAD pic[];
  44. byte unsigned rgbBlue[];
  45. byte unsigned rgbGreen[];
  46. byte unsigned rgbRed[];
  47. byte unsigned rgbReserved[];
  48. int size_x;
  49. int size_y;
  50. //===============================================================
  51. // function new()
  52. //---------------------------------------------------------------
  53. function new(int x,int y);
  54. if(x<0) x=16;
  55. if(x<0) y=16;
  56. this.size_x = x;
  57. this.size_y = y;
  58. rgbBlue = new[x*y];
  59. rgbGreen = new[x*y];
  60. rgbRed = new[x*y];
  61. rgbReserved = new[x*y];
  62. for(int i=0;i<x*y;i++)begin
  63. rgbReserved[i] = 0;
  64. end
  65. endfunction
  66.  
  67. //===============================================================
  68. //---------------------------------------------------------------
  69. task set_dot(
  70. int x,
  71. int y,
  72. bit[7:0] r,
  73. bit[7:0] g,
  74. bit[7:0] b
  75. );
  76. if(x<0 || y<0 || x>size_x || y>size_y)begin
  77. return;
  78. end else begin
  79. rgbBlue [y*size_x+x] = b;
  80. rgbGreen[y*size_x+x] = g;
  81. rgbRed [y*size_x+x] = r;
  82. end
  83. endtask
  84.  
  85. //===============================================================
  86. //---------------------------------------------------------------
  87. task file_write(
  88. string filename
  89. );
  90. integer fp;
  91. fp=$fopen(filename,"wb");
  92. if(!fp)begin
  93. $display("File Open Error.");
  94. $finish;
  95. end
  96. file_header.bfType = "BM"; //
  97. file_header.bfSize = 14+40+(size_x*size_y*3); // file size (byte)
  98. file_header.bfReserved1 = 0; //
  99. file_header.bfReserved2 = 0; //
  100. file_header.bfOffBits = 14+40; //
  101. info_header.biSize = 40; // info header size(byte)
  102. info_header.biWidth = size_x; // picture width(pixel)
  103. info_header.biHeight = size_y; // picture height(pixel)
  104. info_header.biPlanes = 1; // plane num
  105. info_header.biBitCount = 32; // data size(bit) par 1 pixel {1/4/8/24/32}
  106. info_header.biCompression = 0; // compression type 0:none 1:RLE8 2:RLE4 3:bitFields
  107. info_header.biSizeImage = 3780; // pixel data size(byte)
  108. info_header.biXPixPerMeter= 3780; // H dpi
  109. info_header.biYPixPerMeter= 3780; // V dpi
  110. info_header.biClrUsed = 0; // palette depth
  111. info_header.biClrImporant = 0; // important palette index
  112. $fwrite(fp,"%c",file_header.bfType[15: 8] );
  113. $fwrite(fp,"%c",file_header.bfType[ 7: 0] );
  114. $fwrite(fp,"%c",file_header.bfSize[ 7: 0] );
  115. $fwrite(fp,"%c",file_header.bfSize[15: 8] );
  116. $fwrite(fp,"%c",file_header.bfSize[23:16] );
  117. $fwrite(fp,"%c",file_header.bfSize[31:24] );
  118. $fwrite(fp,"%c",file_header.bfReserved1[7:0] );
  119. $fwrite(fp,"%c",file_header.bfReserved1[15:8] );
  120. $fwrite(fp,"%c",file_header.bfReserved2[7:0] );
  121. $fwrite(fp,"%c",file_header.bfReserved2[15:8] );
  122. $fwrite(fp,"%c",file_header.bfOffBits[ 7: 0] );
  123. $fwrite(fp,"%c",file_header.bfOffBits[15: 8] );
  124. $fwrite(fp,"%c",file_header.bfOffBits[23:16] );
  125. $fwrite(fp,"%c",file_header.bfOffBits[31:24] );
  126. $fwrite(fp,"%c",info_header.biSize[ 7: 0] );
  127. $fwrite(fp,"%c",info_header.biSize[15: 8] );
  128. $fwrite(fp,"%c",info_header.biSize[23:16] );
  129. $fwrite(fp,"%c",info_header.biSize[31:24] );
  130. $fwrite(fp,"%c",info_header.biWidth[ 7: 0] );
  131. $fwrite(fp,"%c",info_header.biWidth[15: 8] );
  132. $fwrite(fp,"%c",info_header.biWidth[23:16] );
  133. $fwrite(fp,"%c",info_header.biWidth[31:24] );
  134. $fwrite(fp,"%c",info_header.biHeight[ 7: 0] );
  135. $fwrite(fp,"%c",info_header.biHeight[15: 8] );
  136. $fwrite(fp,"%c",info_header.biHeight[23:16] );
  137. $fwrite(fp,"%c",info_header.biHeight[31:24] );
  138. $fwrite(fp,"%c",info_header.biPlanes[ 7: 0] );
  139. $fwrite(fp,"%c",info_header.biPlanes[15: 8] );
  140. $fwrite(fp,"%c",info_header.biBitCount[ 7: 0] );
  141. $fwrite(fp,"%c",info_header.biBitCount[15: 8] );
  142. $fwrite(fp,"%c",info_header.biCompression[ 7: 0] );
  143. $fwrite(fp,"%c",info_header.biCompression[15: 8] );
  144. $fwrite(fp,"%c",info_header.biCompression[23:16] );
  145. $fwrite(fp,"%c",info_header.biCompression[31:24] );
  146. $fwrite(fp,"%c",info_header.biSizeImage[ 7: 0] );
  147. $fwrite(fp,"%c",info_header.biSizeImage[15: 8] );
  148. $fwrite(fp,"%c",info_header.biSizeImage[23:16] );
  149. $fwrite(fp,"%c",info_header.biSizeImage[31:24] );
  150. $fwrite(fp,"%c",info_header.biXPixPerMeter[ 7: 0]);
  151. $fwrite(fp,"%c",info_header.biXPixPerMeter[15: 8]);
  152. $fwrite(fp,"%c",info_header.biXPixPerMeter[23:16]);
  153. $fwrite(fp,"%c",info_header.biXPixPerMeter[31:24]);
  154. $fwrite(fp,"%c",info_header.biYPixPerMeter[ 7: 0]);
  155. $fwrite(fp,"%c",info_header.biYPixPerMeter[15: 8]);
  156. $fwrite(fp,"%c",info_header.biYPixPerMeter[23:16]);
  157. $fwrite(fp,"%c",info_header.biYPixPerMeter[31:24]);
  158. $fwrite(fp,"%c",info_header.biClrUsed[ 7: 0] );
  159. $fwrite(fp,"%c",info_header.biClrUsed[15: 8] );
  160. $fwrite(fp,"%c",info_header.biClrUsed[23:16] );
  161. $fwrite(fp,"%c",info_header.biClrUsed[31:24] );
  162. $fwrite(fp,"%c",info_header.biClrImporant[ 7: 0] );
  163. $fwrite(fp,"%c",info_header.biClrImporant[15: 8] );
  164. $fwrite(fp,"%c",info_header.biClrImporant[23:16] );
  165. $fwrite(fp,"%c",info_header.biClrImporant[31:24] );
  166.  
  167.  
  168. for(int y=size_y;y>0;y--)begin
  169. for(int x=0;x<size_x;x++)begin
  170. $fwrite(fp,"%c",rgbBlue [(y-1)*size_x+x]);
  171. $fwrite(fp,"%c",rgbGreen [(y-1)*size_x+x]);
  172. $fwrite(fp,"%c",rgbRed [(y-1)*size_x+x]);
  173. $fwrite(fp,"%c",rgbReserved[(y-1)*size_x+x]);
  174. end
  175. end
  176. endtask
  177. endclass : bitmap_data
  178.  
  179. `endif // __BITMAP_DATA__
  180.  















最終更新:2008年11月21日 11:16