228 lines
8.8 KiB
C++
228 lines
8.8 KiB
C++
/*
|
|
*
|
|
* Copyright (C) 2009-2014, OFFIS e.V.
|
|
* All rights reserved. See COPYRIGHT file for details.
|
|
*
|
|
* This software and supporting documentation were developed by
|
|
*
|
|
* OFFIS e.V.
|
|
* R&D Division Health
|
|
* Escherweg 2
|
|
* D-26121 Oldenburg, Germany
|
|
*
|
|
*
|
|
* Module: dcmdata
|
|
*
|
|
* Author: Uli Schlachter
|
|
*
|
|
* Purpose: Class to extract pixel data and meta information from BMP file
|
|
*
|
|
*/
|
|
|
|
#ifndef I2DBMPS_H
|
|
#define I2DBMPS_H
|
|
|
|
#include "dcmtk/config/osconfig.h"
|
|
#include "dcmtk/dcmdata/libi2d/i2dimgs.h"
|
|
#include "dcmtk/ofstd/offile.h"
|
|
|
|
/** This is a I2DImgSource implementation that can parse BMP files and convert
|
|
* them into DICOM images.
|
|
*/
|
|
class DCMTK_I2D_EXPORT I2DBmpSource : public I2DImgSource
|
|
{
|
|
|
|
public:
|
|
|
|
/** Constructor, initializes member variables
|
|
* @return none
|
|
*/
|
|
I2DBmpSource();
|
|
|
|
/** Returns format of input image. For this class "BMP" is returned.
|
|
* @return Returns format of input image, i.e. "BMP".
|
|
*/
|
|
OFString inputFormat() const;
|
|
|
|
/** Extracts the raw BMP pixel data stream from a BMP file and returns some
|
|
* further information about this pixel data. Raw means that any header
|
|
* information is removed from the BMP stream.
|
|
* This function allocates memory for the pixel data returned to the user.
|
|
* The caller of this function is responsible for deleting the memory buffer.
|
|
* @param rows - [out] Rows of image
|
|
* @param cols - [out] Columns of image
|
|
* @param samplesPerPixel - [out] Number of components per pixel
|
|
* @param photoMetrInt - [out] The DICOM color model used for the compressed data
|
|
* @param bitsAlloc - [out] Bits Allocated for one sample
|
|
* @param bitsStored - [out] Bits Stored, Number of bits actually stored within
|
|
* Bits Allocated
|
|
* @param highBit - [out] High Bit, Highest stored in bit within Bits Allocated
|
|
* @param pixelRepr - [out] Pixel Representation (0=unsigned, 1=signed)
|
|
* @param planConf - [out] Planar Configuration
|
|
* @param pixAspectH - [out] Horizontal value of pixel aspect ratio
|
|
* @param pixAspectV - [out] Vertical value of pixel aspect ratio
|
|
* @param pixData - [out] Pointer to the pixel data in BMP Interchange Format
|
|
* @param length - [out] Length of pixel data
|
|
* @param ts - [out] The transfer syntax imposed by the imported pixel pixel data
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition readPixelData( Uint16& rows,
|
|
Uint16& cols,
|
|
Uint16& samplesPerPixel,
|
|
OFString& photoMetrInt,
|
|
Uint16& bitsAlloc,
|
|
Uint16& bitsStored,
|
|
Uint16& highBit,
|
|
Uint16& pixelRepr,
|
|
Uint16& planConf,
|
|
Uint16& pixAspectH,
|
|
Uint16& pixAspectV,
|
|
char*& pixData,
|
|
Uint32& length,
|
|
E_TransferSyntax& ts);
|
|
|
|
/** After reading of pixel data, this function can be used for getting
|
|
* information about lossy compression parameters.
|
|
* @param srcEncodingLossy - [out] Always returns OFFalse (i.e. lossless)
|
|
* @param srcLossyComprMethod - [out] Unused parameter
|
|
* @return EC_Normal if information is available, error otherwise
|
|
*/
|
|
virtual OFCondition getLossyComprInfo(OFBool& srcEncodingLossy,
|
|
OFString& /* srcLossyComprMethod */) const
|
|
{
|
|
srcEncodingLossy = OFFalse;
|
|
return EC_Normal;
|
|
}
|
|
|
|
/** Destructor, frees some memory.
|
|
* @return none
|
|
*/
|
|
virtual ~I2DBmpSource();
|
|
|
|
protected:
|
|
|
|
/** Opens the BMP file specified by the given filename.
|
|
* @param filename - [in] The file to be opened
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition openFile(const OFString& filename);
|
|
|
|
/** Closes BMP file.
|
|
* @return none
|
|
*/
|
|
void closeFile();
|
|
|
|
/** Reads and checks the BMP file header.
|
|
* @param offset - [out] Offset to the BMP data from beginning of file
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition readFileHeader(Uint32 &offset);
|
|
|
|
/** Reads and checks the BMP bitmap header.
|
|
* After this function, the current read position is just after the
|
|
* header. That is, at the beginning of the color palette.
|
|
* @param width - [out] width of the image in pixel
|
|
* @param height - [out] height of the image in pixel
|
|
* @param isTopDown - [out] OFTrue if this is a top down bitmap
|
|
* (height was read as negative value). OFFalse otherwise.
|
|
* @param bpp - [out] bits per pixel of the image.
|
|
* @param colors - [out] number of entries in color table.
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition readBitmapHeader(Uint16 &width /*out*/,
|
|
Uint16 &height /*out*/,
|
|
Uint16 &bpp /*out*/,
|
|
OFBool &isTopDown /*out*/,
|
|
Uint16 &colors /*out*/);
|
|
|
|
/** Read the color palette from the file.
|
|
* @param colors - [in] number of colors to read
|
|
* @param palette - [out] the read color palette is stored here
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition readColorPalette(Uint16 colors,
|
|
Uint32*& palette);
|
|
|
|
/** Read the bitmap data.
|
|
* This assumes the current read position is at the start of the image data.
|
|
* @param width - [in] width of the image in pixel
|
|
* @param height - [in] height of the image in pixel
|
|
* @param bpp - [in] Image's bits per pixel.
|
|
* @param isTopDown - [in] If true, this is a top down bitmap
|
|
* @param colors - [in] Number of color palette entries
|
|
* @param palette - [in] Color palette
|
|
* @param pixData - [out] Image data
|
|
* @param length - [out] Length of data
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition readBitmapData(const Uint16 width,
|
|
const Uint16 height,
|
|
const Uint16 bpp,
|
|
const OFBool isTopDown,
|
|
const Uint16 colors,
|
|
const Uint32* palette,
|
|
char*& pixData /*out*/,
|
|
Uint32& length /*out*/);
|
|
|
|
/** Parse a single 24bpp or 32bpp row of BMP data.
|
|
* @param row - [in] The row of data to parse.
|
|
* @param width - [in] The length in pixel of the row.
|
|
* @param bpp - [in] The number of bits per pixel.
|
|
* @param pixData - [out] The buffer to write the data to (in "RGB" format).
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition parse24_32BppRow(const Uint8 *row,
|
|
const Uint16 width,
|
|
const int bpp,
|
|
char *pixData /*out*/) const;
|
|
|
|
/** Parse a single 16bpp row of BMP data.
|
|
* @param row - [in] The row of data to parse.
|
|
* @param width - [in] The length in pixel of the row.
|
|
* @param pixData - [out] The buffer to write the data to (in "RGB" format).
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition parse16BppRow(const Uint8 *row,
|
|
const Uint16 width,
|
|
char *pixData /*out*/) const;
|
|
|
|
/** Parse a single 1, 4 or 8bpp row of BMP data.
|
|
* @param row - [in] The row of data to parse.
|
|
* @param width - [in] The length in pixel of the row.
|
|
* @param bpp - [in] The number of bits per pixel.
|
|
* @param colors - [in] The number of entries in the color palette.
|
|
* @param palette - [in] The color palette to use.
|
|
* @param pixData - [out] The buffer to write the data to (in "RGB" format).
|
|
* @return EC_Normal, if successful, error otherwise
|
|
*/
|
|
OFCondition parseIndexedColorRow(const Uint8 *row,
|
|
const Uint16 width,
|
|
const int bpp,
|
|
const Uint16 colors,
|
|
const Uint32* palette,
|
|
char *pixData /*out*/) const;
|
|
|
|
/** Read 4 bytes from the byte stream and interpret it as a signed integer.
|
|
* @param result - [out] The result
|
|
* @return 0, if successful, EOF if rest of stream does not contain enough bytes
|
|
*/
|
|
int readLong(Sint32& result);
|
|
|
|
/** Read 4 bytes from the byte stream.
|
|
* @param result - [out] The result
|
|
* @return 0, if successful, EOF if rest of stream does not contain enough bytes
|
|
*/
|
|
int readDWord(Uint32& result);
|
|
|
|
/** Read 2 bytes from the byte stream.
|
|
* @param result - [out] The result
|
|
* @return 0, if successful, EOF if rest of stream does not contain enough bytes
|
|
*/
|
|
int readWord(Uint16& result);
|
|
|
|
/// The BMP file, if opened
|
|
OFFile bmpFile;
|
|
};
|
|
|
|
#endif // I2DBMPS_H
|