530 if(!dib || !handle)
return FALSE;
532 FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
534 int bpp = FreeImage_GetBPP(dib);
535 int width = FreeImage_GetWidth(dib);
536 int height = FreeImage_GetHeight(dib);
575 if (flags == PNM_SAVE_RAW)
580 sprintf(buffer,
"P%d\n%d %d\n", magic, width, height);
581 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
585 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
591 if(image_type == FIT_BITMAP) {
595 if (flags == PNM_SAVE_RAW) {
596 for (y = 0; y < height; y++) {
598 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
600 for (x = 0; x < width; x++) {
601 io->write_proc(&bits[FI_RGBA_RED], 1, 1, handle);
602 io->write_proc(&bits[FI_RGBA_GREEN], 1, 1, handle);
603 io->write_proc(&bits[FI_RGBA_BLUE], 1, 1, handle);
611 for (y = 0; y < height; y++) {
613 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
615 for (x = 0; x < width; x++) {
616 sprintf(buffer,
"%3d %3d %3d ", bits[FI_RGBA_RED], bits[FI_RGBA_GREEN], bits[FI_RGBA_BLUE]);
618 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
624 sprintf(buffer,
"\n");
625 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
639 if (flags == PNM_SAVE_RAW) {
640 for (y = 0; y < height; y++) {
642 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
644 for (x = 0; x < width; x++) {
645 io->write_proc(&bits[x], 1, 1, handle);
651 for (y = 0; y < height; y++) {
653 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
655 for (x = 0; x < width; x++) {
656 sprintf(buffer,
"%3d ", bits[x]);
658 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
664 sprintf(buffer,
"\n");
665 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
678 if (flags == PNM_SAVE_RAW) {
679 for(y = 0; y < height; y++) {
681 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
683 for(x = 0; x < (int)FreeImage_GetLine(dib); x++)
684 io->write_proc(&bits[x], 1, 1, handle);
689 for (y = 0; y < height; y++) {
691 BYTE *bits = FreeImage_GetScanLine(dib, height - 1 - y);
693 for (x = 0; x < (int)FreeImage_GetLine(dib) * 8; x++) {
694 color = (bits[x>>3] & (0x80 >> (x & 0x07))) != 0;
696 sprintf(buffer,
"%c ", color ?
'1':
'0');
698 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
704 sprintf(buffer,
"\n");
705 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
717 else if(image_type == FIT_UINT16) {
718 if (flags == PNM_SAVE_RAW) {
719 for (y = 0; y < height; y++) {
721 WORD *bits = (WORD*)FreeImage_GetScanLine(dib, height - 1 - y);
723 for (x = 0; x < width; x++) {
730 for (y = 0; y < height; y++) {
732 WORD *bits = (WORD*)FreeImage_GetScanLine(dib, height - 1 - y);
734 for (x = 0; x < width; x++) {
735 sprintf(buffer,
"%5d ", bits[x]);
737 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
743 sprintf(buffer,
"\n");
744 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
752 else if(image_type == FIT_RGB16) {
753 if (flags == PNM_SAVE_RAW) {
754 for (y = 0; y < height; y++) {
756 FIRGB16 *bits = (FIRGB16*)FreeImage_GetScanLine(dib, height - 1 - y);
758 for (x = 0; x < width; x++) {
767 for (y = 0; y < height; y++) {
769 FIRGB16 *bits = (FIRGB16*)FreeImage_GetScanLine(dib, height - 1 - y);
771 for (x = 0; x < width; x++) {
772 sprintf(buffer,
"%5d %5d %5d ", bits[x].red, bits[x].green, bits[x].blue);
774 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
780 sprintf(buffer,
"\n");
781 io->write_proc(&buffer, (
unsigned int)strlen(buffer), 1, handle);
static void WriteWord(FreeImageIO *io, fi_handle handle, const WORD value)