#include <fstream>
#include "gdcm_charls.h"
int main(int argc, char *argv[])
{
if( argc < 3 )
{
std::cerr << argv[0] << " input.dcm output.dcm" << std::endl;
return 1;
}
const char *filename = argv[1];
const char *outfilename = argv[2];
{
return 1;
}
if( !sf )
{
std::cerr << "No pixel data (or not encapsulated)" << std::endl;
return 1;
}
{
std::cerr << "Unsupported" << std::endl;
return 1;
}
std::vector<unsigned char> rgbyteOutall;
{
if( !bv ) return 1;
std::vector<char> vbuffer;
vbuffer.resize( totalLen );
char *buffer = vbuffer.data();
const unsigned char* pbyteCompressed0 = (const unsigned char*)buffer;
while( totalLen > 0 && pbyteCompressed0[totalLen-1] != 0xd9 )
{
totalLen--;
}
JlsParameters metadata;
char errorMsg[256+1]={'\0'};
if (JpegLsReadHeader(buffer, totalLen, &metadata, errorMsg) != charls::ApiResult::OK)
{
std::cerr << "Can't parse jpegls: " << errorMsg << std::endl;
return 1;
}
std::cout << metadata.width << std::endl;
std::cout << metadata.height << std::endl;
std::cout << metadata.bitsPerSample << std::endl;
std::cout << pf << std::endl;
unsigned char marker_lse_13[] = {
0xFF, 0xF8, 0x00, 0x0D,
0x01,
0x1F, 0xFF,
0x00, 0x22,
0x00, 0x83,
0x02, 0x24,
0x00, 0x40
};
unsigned char marker_lse_14[] = {
0xFF, 0xF8, 0x00, 0x0D,
0x01,
0x3F, 0xFF,
0x00, 0x42,
0x01, 0x03,
0x04, 0x44,
0x00, 0x40
};
unsigned char marker_lse_15[] = {
0xFF, 0xF8, 0x00, 0x0D,
0x01,
0x7F, 0xFF,
0x00, 0x82,
0x02, 0x03,
0x08, 0x84,
0x00, 0x40
};
unsigned char marker_lse_16[] = {
0xFF, 0xF8, 0x00, 0x0D,
0x01,
0xFF, 0xFF,
0x01, 0x02,
0x04, 0x03,
0x11, 0x04,
0x00, 0x40
};
const unsigned char *marker_lse = nullptr;
switch( metadata.bitsPerSample )
{
case 13:
marker_lse = marker_lse_13;
break;
case 14:
marker_lse = marker_lse_14;
break;
case 15:
marker_lse = marker_lse_15;
break;
case 16:
marker_lse = marker_lse_16;
break;
}
if( !marker_lse )
{
std::cerr << "Can't handle: " << metadata.bitsPerSample << std::endl;
return 1;
}
vbuffer.insert (vbuffer.begin() + 0x0F, marker_lse, marker_lse+15);
#if 0
std::ofstream of( "/tmp/d.jls", std::ios::binary );
of.write( &vbuffer[0], vbuffer.size() );
of.close();
#endif
const char *pbyteCompressed = vbuffer.data();
size_t cbyteCompressed = vbuffer.size();
JlsParameters params;
JpegLsReadHeader(pbyteCompressed, cbyteCompressed, ¶ms, nullptr);
std::vector<unsigned char> rgbyteOut;
rgbyteOut.resize(params.height *params.width * ((params.bitsPerSample + 7)
/ 8) * params.components);
CharlsApiResultType result =
JpegLsDecode(rgbyteOut.data(), rgbyteOut.size(), pbyteCompressed, cbyteCompressed, ¶ms, errorMsg );
if (result != charls::ApiResult::OK)
{
std::cerr << "Could not patch JAI-JPEGLS: " << errorMsg << std::endl;
return 1;
}
rgbyteOutall.insert( rgbyteOutall.end(), rgbyteOut.begin(), rgbyteOut.end() );
}
pixeldata.
SetByteValue( (
char*)rgbyteOutall.data(), (uint32_t)rgbyteOutall.size() );
std::cout << "Success !" << std::endl;
return 0;
}
const PixelFormat & GetPixelFormat() const
Get/Set PixelFormat.
Definition gdcmBitmap.h:107
const unsigned int * GetDimensions() const
Return the dimension of the pixel data, first dimension (x), then 2nd (y), then 3rd (z)....
Class to represent binary value (array of bytes)
Definition gdcmByteValue.h:35
bool GetBuffer(char *buffer, unsigned long length) const
VL GetLength() const override
Definition gdcmByteValue.h:77
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
const ByteValue * GetByteValue() const
Definition gdcmDataElement.h:133
bool IsEmpty() const
Check if Data Element is empty.
Definition gdcmDataElement.h:106
const SequenceOfFragments * GetSequenceOfFragments() const
void SetByteValue(const char *array, VL length)
Definition gdcmDataElement.h:126
void SetVR(VR const &vr)
Definition gdcmDataElement.h:88
const DataElement & GetDataElement(const Tag &t) const
Definition gdcmDataSet.h:188
void Replace(const DataElement &de)
Replace a dataelement with another one.
Definition gdcmDataSet.h:150
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
const FileMetaInformation & GetHeader() const
Get File Meta Information.
Definition gdcmFile.h:48
Class to represent a Fragment.
Definition gdcmFragment.h:44
ImageReader.
Definition gdcmImageReader.h:34
const Image & GetImage() const
Return the read image.
Image.
Definition gdcmImage.h:47
const File & GetFile() const
Set/Get File.
Definition gdcmReader.h:72
void SetFileName(const char *filename_native)
Class to represent a Sequence Of Fragments.
Definition gdcmSequenceOfFragments.h:32
const Fragment & GetFragment(SizeType num) const
SizeType GetNumberOfFragments() const
Class to represent a DICOM Data Element (Attribute) Tag (Group, Element).
Definition gdcmTag.h:39
@ ExplicitVRLittleEndian
Definition gdcmTransferSyntax.h:64
@ OW
Definition gdcmVR.h:77
Writer ala DOM (Document Object Model)
Definition gdcmWriter.h:49
virtual bool Write()
Main function to tell the writer to write.
void SetFile(const File &f)
Set/Get the DICOM file (DataSet + Header)
Definition gdcmWriter.h:66
void SetFileName(const char *filename_native)
Set the filename of DICOM file to write: