Hi,

I'm trying to use HDF5DotNet to write some grayscale pictures provided by
special camera and saved in TIFF format. Each color component is 16 bits (
2Bytes for R, 2Bytes for G, 2Bytes for B).
I have no problem to store some INDEXED or TRUECOLOR pictures but I
have not managed
to write properly these pictures.


I created a dataset that contain the picture matrix with values between 0
and 65535. (so datatype is H5T.H5Type.NATIVE_USHORT).

i wrote attributes like:

   1. CLASS = IMAGE
   2. IMAGE_SUBCLASS = IMAGE_GRAYSCALE
   3. IMAGE_VERSION = 1.2

I need to keep the precision of the 16-bit encoding for further work but
how to view these images in HDFView with a default palette with min and max
set to [0,255].

   - A value of 0 for black color.
   - A value of 65535 for white color.

If I set all pixel values to 30 000 the picture becomes black.

If I set all pixel values to 0 the picture becomes black.

So, how can I process to make link between the 16-bit coded value and the
256-color palette ?


Here a piece of code for generating a test picture:

                ushort[,] dset_data48bit = new ushort[500, 500];
                for (int i = 0; i < 500; i++)
                {
                    for (int j = 0; j < 500; j++)
                    {

                              dset_data48bit[i, j] = 0;
                    }
                }


The "dset_data48bit" array is passed as an argument of the method make_image

//Creation of the picture

public int make_image(H5FileOrGroupId a_oFileId, string a_strImageName, int
a_width, int a_height, ushort[,] a_valeurImage)
        {
            H5DataSetId oDataSetId = null;
            int resRetour = -1;
            long[] dims = new long[IMAGE8_RANK];

            /* On initialise les dimensions de l'image */
            dims[0] = a_height;
            dims[1] = a_width;
            try
            {
                /* Make the dataset */
                oDataSetId = make_dataset_image(a_oFileId, a_strImageName,
IMAGE8_RANK, dims, H5T.H5Type.NATIVE_USHORT, a_valeurImage);

                /* Attach the CLASS attribute */
                WriteAttribute_String(oDataSetId, "CLASS", "IMAGE");

                /* Attach the VERSION attribute */
                WriteAttribute_String(oDataSetId, "IMAGE_VERSION", "1.2");

                /* Attach the IMAGE_SUBCLASS attribute */
                WriteAttribute_String(oDataSetId, "IMAGE_SUBCLASS",
"IMAGE_GRAYSCALE");

                H5DataSpaceId oDataSpaceId = null;
                H5AttributeId oAttributeId = null;
                H5DataTypeId oDataTypeId = null;

                ushort[] tBuffer = {0,65535}; // ushort limit
                long[] dimension = { 2 };

                oDataSpaceId = H5S.create_simple(1, dimension);
                oDataTypeId = H5T.copy(H5T.H5Type.NATIVE_USHORT);
                oAttributeId = H5A.create(oDataSetId, "IMAGE_MINMAXRANGE",
oDataTypeId, oDataSpaceId);
                H5A.write(oAttributeId, oDataTypeId, new
H5Array<ushort>(tBuffer));

                if (oDataSpaceId != null) H5S.close(oDataSpaceId);
                if (oAttributeId != null) H5A.close(oAttributeId);
            }
            catch { }
            finally
            {
                if (oDataSetId != null) H5D.close(oDataSetId);
            }

            return resRetour;
        }

//Creation of the DataSet for the picture
public H5DataSetId make_dataset_image(
H5FileOrGroupId a_oLocId, string a_strDataSetName, int rank, long[] dims,
H5T.H5Type a_H5Type, ushort[,] data)
        {
            H5DataSpaceId oDataSpaceId = null;
            H5DataSetId oDataSetId = null;
            H5DataTypeId oDataTypeId = null;
            try
            {
                //// Open an HDF5 file.
                //oFileId = H5F.open(strHdf5FilePath,
H5F.OpenMode.ACC_RDWR);

                // Create dataspace. Setting maximum size to NULL sets the
maximum
                // size to be the current size.
                oDataSpaceId = H5S.create_simple(rank, dims);

                if (oDataSpaceId != null)
                    oDataSetId = H5D.create(a_oLocId, a_strDataSetName,
a_H5Type, oDataSpaceId);

                oDataTypeId = H5T.copy(a_H5Type);
                // Write the data to the dataset.
                if (oDataSetId != null)
                    H5D.write(oDataSetId, oDataTypeId, new
H5Array<ushort>(data));
            }
            catch
            {

            }
            finally
            {
                if (oDataSpaceId != null) H5S.close(oDataSpaceId);
                if (oDataTypeId != null) H5T.close(oDataTypeId);
            }

            return oDataSetId;
        }

Thank you and don't hesitate to ask for additionnal informations (I'm not
fluent in english) !
_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to