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