Created
June 16, 2017 13:45
-
-
Save kristianlm/5d19cea6648d05bd624cc20fe80126a2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// show an image in the terminal using ascii colors | |
// demonstrates raw pixel access | |
// (only works on certain image file types, though) | |
#include <stdio.h> | |
#include <FreeImage.h> | |
int meta(FIBITMAP *dib) { | |
FITAG *tag = NULL; | |
FIMETADATA *mdhandle = NULL; | |
mdhandle = FreeImage_FindFirstMetadata(FIMD_EXIF_MAIN, dib, &tag); | |
if(mdhandle) { | |
do { | |
// process the tag | |
printf("%s\n", FreeImage_GetTagKey(tag)); | |
// ... | |
} while(FreeImage_FindNextMetadata(mdhandle, &tag)); | |
FreeImage_FindCloseMetadata(mdhandle); | |
} else { | |
printf("no metadata found for %p \n", dib); | |
} | |
} | |
int dump (FIBITMAP *dib) { | |
unsigned width = FreeImage_GetWidth(dib); | |
unsigned height = FreeImage_GetHeight(dib); | |
unsigned pitch = FreeImage_GetPitch(dib); | |
unsigned line = FreeImage_GetLine(dib); | |
int x, y; | |
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib); | |
BYTE *bits = (BYTE*)FreeImage_GetBits(dib); | |
// test pixel access avoiding scanline calculations | |
// to speed-up the image processing | |
int bytespp = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib); | |
if(image_type == FIT_BITMAP) { | |
for(y = height-1; y >= 0; y--) { | |
printf("\n"); | |
for(x = 0; x < width; x++) { | |
int r,g,b; | |
if((bytespp == 3) || (bytespp == 4)) { | |
r = bits[y*pitch + x*bytespp + FI_RGBA_RED]; | |
g = bits[y*pitch + x*bytespp + FI_RGBA_GREEN]; | |
b = bits[y*pitch + x*bytespp + FI_RGBA_BLUE]; | |
} else if ((bytespp == 1)) { | |
r = g = b = bits[y*pitch + x*bytespp]; | |
} else { | |
printf("unknown bpp %d\n", bytespp); | |
return -1; | |
} | |
// print a full-blown square with the right color (most | |
// terminals should support this). | |
printf("\x1b[38;2;%d;%d;%dm█", r,g,b); | |
} | |
} | |
} else { | |
printf("unknown image type\n"); | |
} | |
} | |
int main(int argc, char** argv) { | |
if(argc != 2) { | |
printf("missing filename argument\n"); | |
return -1; | |
} | |
char *filename = argv[1]; | |
FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(filename); | |
FIBITMAP *dib = FreeImage_Load(fif, filename, 0); | |
printf("loaded %p\n", dib); | |
if(dib) { | |
printf("%p is %d x %d x %d\n", dib, FreeImage_GetWidth(dib), FreeImage_GetHeight(dib), FreeImage_GetBPP(dib)); | |
meta(dib); | |
dump(dib); | |
FreeImage_Unload(dib); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment