FACT++  1.0
void MStarguider::WritePNG ( const char *  name,
const byte gbuf,
const byte cbuf 
)
private

Definition at line 976 of file MStarguider.cc.

References fScreenshotColor.

Referenced by ProcessFrame().

977 {
978  string fname(name);
979  if (fname.size()<4 || fname.compare(fname.size()-4,4, ".png")==0)
980  fname += ".png";
981 
982  cout << "Writing PNG '" << fname << "'" << endl;
983 
984 #ifdef HAVE_PNG
985  //
986  // open file
987  //
988  FILE *fd = fopen(fname.c_str(), "w");
989  if (!fd)
990  {
991  cout << "Warning: Cannot open file for writing." << endl;
992  return;
993  }
994 
995  //
996  // allocate memory
997  //
998  png_structp fPng = png_create_write_struct(PNG_LIBPNG_VER_STRING,
999  NULL, NULL, NULL);
1000 
1001  if (!fPng)
1002  {
1003  cout << "Warning: Unable to create PNG structure" << endl;
1004  fclose(fd);
1005  return;
1006  }
1007 
1008 
1009  png_infop fInfo = png_create_info_struct(fPng);
1010 
1011  if (!fInfo)
1012  {
1013  cout << "Warning: Unable to create PNG info structure" << endl;
1014  png_destroy_write_struct (&fPng, NULL);
1015  fclose(fd);
1016  return;
1017  }
1018 
1019  fInfo->width = 768;
1020  fInfo->height = 576;
1021  fInfo->bit_depth = 8;
1022  fInfo->color_type = PNG_COLOR_TYPE_RGB;
1023 // fInfo->color_type = PNG_COLOR_TYPE_GRAY;
1024 
1025  //
1026  // set jump-back point in case of errors
1027  //
1028  if (setjmp(fPng->jmpbuf))
1029  {
1030  cout << "longjmp Warning: PNG encounterd an error!" << endl;
1031  png_destroy_write_struct (&fPng, &fInfo);
1032  fclose(fd);
1033  return;
1034  }
1035 
1036  //
1037  // connect file to PNG-Structure
1038  //
1039  png_init_io(fPng, fd);
1040 
1041  // png_set_compression_level (fPng, Z_BEST_COMPRESSION);
1042 
1043  //
1044  // Write header
1045  //
1046  png_write_info(fPng, fInfo);
1047 
1048  png_byte buf[768*576*3];
1049 
1050  png_byte *d = buf;
1051  const byte *g = gbuf;
1052  const byte *c = cbuf;
1053 
1054  // d=destination, s1=source1, s2=source2, e=end
1055  while (d<buf+768*576*3)
1056  {
1057  if (fScreenshotColor && *c)
1058  {
1059  *d++ = ((*c>>4)&0x3)*85;
1060  *d++ = ((*c>>2)&0x3)*85;
1061  *d++ = ((*c++ )&0x3)*85;
1062  g++;
1063  }
1064  else
1065  {
1066  *d++ = *g;
1067  *d++ = *g;
1068  *d++ = *g++;
1069  c++;
1070  }
1071  }
1072 
1073  //
1074  // Write bitmap data
1075  //
1076  for (unsigned int y=0; y<768*576*3; y+=768*3)
1077  png_write_row (fPng, buf+y);
1078 
1079  //
1080  // Write footer
1081  //
1082  png_write_end (fPng, fInfo);
1083 
1084  //
1085  // free memory
1086  //
1087  png_destroy_write_struct (&fPng, &fInfo);
1088 
1089  fclose(fd);
1090 #else
1091  cout << "Sorry, no png support compiled into tpoint." << endl;
1092 #endif
1093 }
bool fScreenshotColor
Definition: MStarguider.h:65
unsigned char byte
Definition: MGImage.h:17

+ Here is the caller graph for this function: