coreldraw_riffinfo.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1.  #include "coreldraw_riffinfo.h"
  2. // 00000000h: 52 49 46 46 C4 AE 00 00 43 44 72 39 76 72 73 6E ; RIFF漠..CDr9vrsn
  3. // 00000010h: 02 00 00 00 84 03 44 49 53 50 2C 28 00 00 08 00 ; ...._DISP__....
  4. // 读RIFF_CDR_TYPE 文件头和软件版本号
  5. RIFF_CDR_TYPE cdr_riff ;
  6. // 获得 CorelDRAW X3文件 为止的版本号
  7. int get_cdrfile_version(const char* cdr_filename)
  8. {
  9. FILE* cdr_pfile = fopen(cdr_filename , "rb");
  10. if (cdr_pfile == NULL){
  11. fclose(cdr_pfile);
  12. return -1; // 文件不能读 返回 -1
  13. }
  14. fread(&cdr_riff , 1 , sizeof(cdr_riff) , cdr_pfile);
  15. if ('PK' == FCC(cdr_riff.riff << 16)){
  16. fseek(cdr_pfile,0,SEEK_END);
  17. cdr_riff.cb = ftell(cdr_pfile) -8;
  18. cdr_riff.version = 1400;
  19. // printf("CDR文件版本X4或者以上,暂时没有去写区分程序,所以不能精确识别!\n\a");
  20. }
  21. // printf("%d\t%d\t%d\n", sizeof(cdr_riff), cdr_riff.version, cdr_riff.cb);
  22. fclose(cdr_pfile);
  23. return cdr_riff.version;
  24. }
  25. // CorelDRAW 13版本之前文件 cdr_filename 展开缩略图 bmp_filename
  26. bool cdr_riff_disp2bmp(const char* cdr_filename, const char* bmp_filename)
  27. {
  28. FILE* cdr_pfile = fopen(cdr_filename , "rb");
  29. fread(&cdr_riff , 1 , sizeof(cdr_riff) , cdr_pfile);
  30. // 检索 DISP_chunk 的数据是bmp缩略图数据
  31. RIFFCHUNK disp_chunk;
  32. fread(&disp_chunk , 1 , sizeof(disp_chunk) , cdr_pfile);
  33. // 跳过非 DISP 数据区
  34. while (FCC('DISP') != disp_chunk.fcc && !feof(cdr_pfile)) {
  35. fseek(cdr_pfile, disp_chunk.cb, SEEK_CUR);
  36. fread(&disp_chunk , 1 , sizeof(disp_chunk) , cdr_pfile);
  37. }
  38. // DISP_chunk 的数据是bmp缩略图数据,前面加10字节放 用来放'BM'文件头
  39. size_t raw_size = disp_chunk.cb;
  40. if (FCC('DISP') == disp_chunk.fcc) {
  41. char* bmp_buf = new char[raw_size + 10];
  42. fread(bmp_buf + 10, 1, raw_size , cdr_pfile);
  43. for (int i = 0 ; i != 12 ; i++)
  44. bmp_buf[i] = '\0';
  45. *(WORD*)bmp_buf = MAKEWORD('B', 'M') ; // BMP 文件头
  46. WORD* pBitCount = (WORD*)(bmp_buf + 0x1C);
  47. if (*pBitCount == 8) {
  48. bmp_buf[10] = 0x36; // 256色索引图像,位图数据在文件中的
  49. bmp_buf[11] = 0x04; // 起始位置 0x3604
  50. } else if (*pBitCount == 4) {
  51. bmp_buf[10] = 0x76; // 16色索引
  52. } else if (*pBitCount == 1) {
  53. bmp_buf[10] = 0x3E; // 黑白颜色
  54. } else if (*pBitCount == 24) {
  55. bmp_buf[10] = 0x36; // 24位 位图,碰不到
  56. }
  57. DWORD* bmpsize = (DWORD*)(bmp_buf + 2);
  58. *bmpsize = raw_size + 10;
  59. FILE* bmp_dispfile;
  60. bmp_dispfile = fopen(bmp_filename , "wb");
  61. fwrite(bmp_buf, 1, raw_size + 10, bmp_dispfile);
  62. fclose(bmp_dispfile);
  63. delete[] bmp_buf;
  64. }
  65. fclose(cdr_pfile);
  66. return (FCC('DISP') == disp_chunk.fcc);
  67. }