/**********************************************************************************/ /* * File name: MBufColor.cpp * Location: See Matrox Example Launcher in the MIL Control Center * * * Synopsis: This program demonstrates color buffer manipulations. It allocates * a displayable color image buffer, displays it, and loads a color * image into the left part. After that, color annotations are done * in each band of the color buffer. Finally, to increase the image * luminance, the image is converted to Hue, Saturation and Luminance * (HSL), a certain offset is added to the luminance component and * the image is converted back to Red, Green, Blue (RGB) into the * right part to display the result. * * The example also demonstrates how to display multiple images * in a single display using child buffers. * * Copyright (C) Matrox Electronic Systems Ltd., 1992-2020. * All Rights Reserved */ #include <mil.h> /* Source MIL image file specifications. */ #define IMAGE_FILE M_IMAGE_PATH MIL_TEXT("Bird.mim") /* Luminance offset to add to the image. */ #define IMAGE_LUMINANCE_OFFSET 40L /* Main function. */ int MosMain(void) { MIL_ID MilApplication, /* Application identifier. */ MilSystem, /* System identifier. */ MilDisplay, /* Display identifier. */ MilImage, /* Image buffer identifier. */ MilLeftSubImage, /* Sub-image buffer identifier for original image. */ MilRightSubImage, /* Sub-image buffer identifier for processed image.*/ MilLumSubImage=0, /* Sub-image buffer identifier for luminance. */ MilRedBandSubImage, /* Sub-image buffer identifier for red component. */ MilGreenBandSubImage, /* Sub-image buffer identifier for green component.*/ MilBlueBandSubImage; /* Sub-image buffer identifier for blue component. */ MIL_INT SizeX, SizeY, SizeBand, Type; /* Allocate defaults. */ MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, &MilDisplay, M_NULL, M_NULL); /* Allocate a color display buffer twice the size of the source image and display it. */ MbufAllocColor(MilSystem, MbufDiskInquire(IMAGE_FILE, M_SIZE_BAND, &SizeBand), MbufDiskInquire(IMAGE_FILE, M_SIZE_X, &SizeX) * 2, MbufDiskInquire(IMAGE_FILE, M_SIZE_Y, &SizeY), MbufDiskInquire(IMAGE_FILE, M_TYPE, &Type), M_IMAGE+M_DISP+M_PROC, &MilImage); MbufClear(MilImage, 0L); MdispSelect(MilDisplay, MilImage); /* Define 2 child buffers that maps to the left and right part of the display buffer, to put the source and destination color images. */ MbufChild2d(MilImage, 0L, 0L, SizeX, SizeY, &MilLeftSubImage); MbufChild2d(MilImage, SizeX, 0L, SizeX, SizeY, &MilRightSubImage); /* Load the color source image on the left. */ MbufLoad(IMAGE_FILE, MilLeftSubImage); /* Define child buffers that map to the red, green and blue components of the source image. */ MbufChildColor(MilLeftSubImage, M_RED, &MilRedBandSubImage); MbufChildColor(MilLeftSubImage, M_GREEN, &MilGreenBandSubImage); MbufChildColor(MilLeftSubImage, M_BLUE, &MilBlueBandSubImage); /* Write color text annotations to show access in each individual band of the image. Note that this is typically done more simply by using: MgraColor(M_DEFAULT, M_RGB888(0xFF,0x90,0x00)); MgraText(M_DEFAULT, MilLeftSubImage, ...); */ MgraColor(M_DEFAULT, 0xFF); MgraText(M_DEFAULT, MilRedBandSubImage, SizeX/16, SizeY/8, MIL_TEXT(" TOUCAN ")); MgraColor(M_DEFAULT, 0x90); MgraText(M_DEFAULT, MilGreenBandSubImage, SizeX/16, SizeY/8, MIL_TEXT(" TOUCAN ")); MgraColor(M_DEFAULT, 0x00); MgraText(M_DEFAULT, MilBlueBandSubImage, SizeX/16, SizeY/8, MIL_TEXT(" TOUCAN ")); /* Print a message. */ MosPrintf(MIL_TEXT("\nCOLOR OPERATIONS:\n")); MosPrintf(MIL_TEXT("-----------------\n\n")); MosPrintf(MIL_TEXT("A color source image was loaded on the left and color text\n")); MosPrintf(MIL_TEXT("annotations were written in it.\n")); MosPrintf(MIL_TEXT("Press <Enter> to continue.\n\n")); MosGetch(); /* Convert image to Hue, Saturation, Luminance color space (HSL). */ MimConvert(MilLeftSubImage, MilRightSubImage, M_RGB_TO_HSL); /* Create a child buffer that maps to the luminance component. */ MbufChildColor(MilRightSubImage, M_LUMINANCE, &MilLumSubImage); /* Add an offset to the luminance component. */ MimArith(MilLumSubImage, IMAGE_LUMINANCE_OFFSET, MilLumSubImage, M_ADD_CONST+M_SATURATION); /* Convert image back to Red, Green, Blue color space (RGB) for display. */ MimConvert(MilRightSubImage, MilRightSubImage, M_HSL_TO_RGB); /* Print a message. */ MosPrintf(MIL_TEXT("Luminance was increased using color image processing.\n")); /* Print a message. */ MosPrintf(MIL_TEXT("Press <Enter> to end.\n")); MosGetch(); /* Release sub-images and color image buffer. */ MbufFree(MilLumSubImage); MbufFree(MilRedBandSubImage); MbufFree(MilGreenBandSubImage); MbufFree(MilBlueBandSubImage); MbufFree(MilRightSubImage); MbufFree(MilLeftSubImage); MbufFree(MilImage); /* Release defaults. */ MappFreeDefault(MilApplication, MilSystem, MilDisplay, M_NULL, M_NULL); return 0; }