void Image::SaveTGA(const char *filename) const { assert(filename != NULL); // must end in .tga const char *ext = &filename[strlen(filename)-4]; assert(!strcmp(ext,".tga")); FILE *file = fopen(filename,"wb"); // misc header information for (int i = 0; i < 18; i++) { //unsigned char tmp; if (i == 2) WriteByte(file,2); else if (i == 12) WriteByte(file,width%256); else if (i == 13) WriteByte(file,width/256); else if (i == 14) WriteByte(file,height%256); else if (i == 15) WriteByte(file,height/256); else if (i == 16) WriteByte(file,24); else if (i == 17) WriteByte(file,32); else WriteByte(file,0); } // the data // flip y so that (0,0) is bottom left corner for (int y = height-1; y >= 0; y--) { for (int x = 0; x < width; x++) { Vec3f v = GetPixel(x,y); // note reversed order: b, g, r WriteByte(file,ClampColorComponent(v.b())); WriteByte(file,ClampColorComponent(v.g())); WriteByte(file,ClampColorComponent(v.r())); } } fclose(file); }
void Image::SavePPM(const char *filename) const { assert(filename != NULL); // must end in .ppm const char *ext = &filename[strlen(filename)-4]; assert(!strcmp(ext,".ppm")); FILE *file = fopen(filename, "w"); // misc header information assert(file != NULL); fprintf (file, "P6\n"); fprintf (file, "# Creator: Image::SavePPM()\n"); fprintf (file, "%d %d\n", width,height); fprintf (file, "255\n"); // the data // flip y so that (0,0) is bottom left corner for (int y = height-1; y >= 0; y--) { for (int x=0; x<width; x++) { Vec3f v = GetPixel(x,y); fputc (ClampColorComponent(v.r()),file); fputc (ClampColorComponent(v.g()),file); fputc (ClampColorComponent(v.b()),file); } } fclose(file); }
int Image::SaveBMP(const char *filename) { int i, j, ipos; int bytesPerLine; unsigned char *line; Vector3f*rgb = data; FILE *file; struct BMPHeader bmph; /* The length of each line must be a multiple of 4 bytes */ bytesPerLine = (3 * (width + 1) / 4) * 4; strcpy(bmph.bfType, "BM"); bmph.bfOffBits = 54; bmph.bfSize = bmph.bfOffBits + bytesPerLine * height; bmph.bfReserved = 0; bmph.biSize = 40; bmph.biWidth = width; bmph.biHeight = height; bmph.biPlanes = 1; bmph.biBitCount = 24; bmph.biCompression = 0; bmph.biSizeImage = bytesPerLine * height; bmph.biXPelsPerMeter = 0; bmph.biYPelsPerMeter = 0; bmph.biClrUsed = 0; bmph.biClrImportant = 0; file = fopen (filename, "wb"); if (file == NULL) return(0); fwrite(&bmph.bfType, 2, 1, file); fwrite(&bmph.bfSize, 4, 1, file); fwrite(&bmph.bfReserved, 4, 1, file); fwrite(&bmph.bfOffBits, 4, 1, file); fwrite(&bmph.biSize, 4, 1, file); fwrite(&bmph.biWidth, 4, 1, file); fwrite(&bmph.biHeight, 4, 1, file); fwrite(&bmph.biPlanes, 2, 1, file); fwrite(&bmph.biBitCount, 2, 1, file); fwrite(&bmph.biCompression, 4, 1, file); fwrite(&bmph.biSizeImage, 4, 1, file); fwrite(&bmph.biXPelsPerMeter, 4, 1, file); fwrite(&bmph.biYPelsPerMeter, 4, 1, file); fwrite(&bmph.biClrUsed, 4, 1, file); fwrite(&bmph.biClrImportant, 4, 1, file); line = (unsigned char *)malloc(bytesPerLine); if (line == NULL) { fprintf(stderr, "Can't allocate memory for BMP file.\n"); return(0); } for (i = 0; i < height ; i++) { for (j = 0; j < width; j++) { ipos = (width * i + j); line[3*j] = ClampColorComponent(rgb[ipos][2]); line[3*j+1] =ClampColorComponent( rgb[ipos][1]); line[3*j+2] = ClampColorComponent( rgb[ipos][0]); } fwrite(line, bytesPerLine, 1, file); } free(line); fclose(file); return(1); }