X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmFile.cxx;h=2defabdaebfcadf3c4ec6046467059cda33038c6;hb=00e89cde772e18e4f2baab2b01680330af909d59;hp=7a3c1fcc51fce46acc2e466a028b3e4d08668bb3;hpb=67845c7dc1241480f5c5fcfa0cfc2e86918dad1e;p=gdcm.git diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 7a3c1fcc..2defabda 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2004/10/08 16:27:20 $ - Version: $Revision: 1.135 $ + Date: $Date: 2004/10/08 17:24:54 $ + Version: $Revision: 1.137 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -520,10 +520,12 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t maxSize) bool signedPixel = Header->IsSignedPixelData(); - ConvertReorderEndianity( (uint8_t*) destination, + gdcmPixelConvert::ConvertReorderEndianity( + (uint8_t*) destination, ImageDataSize, numberBitsStored, numberBitsAllocated, + Header->GetSwapCode(), signedPixel ); ConvertReArrangeBits( (uint8_t*) destination, @@ -656,39 +658,6 @@ void gdcmFile::ConvertReArrangeBits( uint8_t* pixelZone, } } -/** - * \brief Deal with endianity i.e. re-arange bytes inside the integer - */ -void gdcmFile::ConvertReorderEndianity( uint8_t* pixelZone, - size_t imageDataSize, - int numberBitsStored, - int numberBitsAllocated, - bool signedPixel) -{ - if ( numberBitsAllocated != 8 ) - { - SwapZone( pixelZone, Header->GetSwapCode(), ImageDataSize, - numberBitsAllocated ); - } - - // Special kludge in order to deal with xmedcon broken images: - if ( ( numberBitsAllocated == 16 ) - && ( numberBitsStored < numberBitsAllocated ) - && ( ! signedPixel ) ) - { - int l = (int)(ImageDataSize / (numberBitsAllocated/8)); - uint16_t *deb = (uint16_t *)pixelZone; - for(int i = 0; i> 8) | (im16[i] << 8 ); - } - break; - default: - std::cout << "SWAP value (16 bits) not allowed :i" << swap << - std::endl; - } - } - else if( nb == 32 ) - { - uint32_t s32; - uint16_t fort, faible; - uint32_t* im32 = (uint32_t*)im; - switch ( swap ) - { - case 0: - case 1234: - break; - case 4321: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 4321 - fort = im32[i] >> 16; - fort = ( fort >> 8 ) | ( fort << 8 ); - faible = ( faible >> 8 ) | ( faible << 8); - s32 = faible; - im32[i] = ( s32 << 16 ) | fort; - } - break; - case 2143: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 2143 - fort = im32[i] >> 16; - fort = ( fort >> 8 ) | ( fort << 8 ); - faible = ( faible >> 8) | ( faible << 8); - s32 = fort; - im32[i] = ( s32 << 16 ) | faible; - } - break; - case 3412: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 3412 - fort = im32[i] >> 16; - s32 = faible; - im32[i] = ( s32 << 16 ) | fort; - } - break; - default: - std::cout << "SWAP value (32 bits) not allowed : " << swap << - std::endl; - } - } -} - /** * \brief Read pixel data from disk (optionaly decompressing) into the * caller specified memory location. @@ -1054,7 +940,8 @@ bool gdcmFile::ReadPixelData(void* destination) if ( Header->GetBitsAllocated() == 12 ) { - ConvertDecompress12BitsTo16Bits( (uint8_t*)destination, + gdcmPixelConvert::ConvertDecompress12BitsTo16Bits( + (uint8_t*)destination, Header->GetXSize(), Header->GetYSize(), fp); @@ -1181,11 +1068,17 @@ bool gdcmFile::ReadPixelData(void* destination) // Reading Fragment pixels res = gdcm_read_JPEG_file (fp,destination); } - else + else if ( Header->GetBitsStored() == 12) { // Reading Fragment pixels res = gdcm_read_JPEG_file12 (fp,destination); } + else + { + // other JPEG lossy not supported + dbg.Error(" gdcmFile::ReadPixelData : unknown jpeg lossy compression"); + return 0; + } // ------------------------------------- endif (JPEGLossy) } @@ -1216,56 +1109,3 @@ bool gdcmFile::ReadPixelData(void* destination) return res; } -/** - * \brief Read from file a 12 bits per pixel image and uncompress it - * into a 16 bits per pixel image. - */ -void gdcmFile::ConvertDecompress12BitsTo16Bits( - uint8_t* pixelZone, - int sizeX, - int sizeY, - FILE* filePtr) - throw ( gdcmFormatError ) -{ - int nbPixels = sizeX * sizeY; - uint16_t* destination = (uint16_t*)pixelZone; - - for( int p = 0; p < nbPixels; p += 2 ) - { - uint8_t b0, b1, b2; - size_t ItemRead; - - ItemRead = fread( &b0, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound first block" ); - } - - ItemRead = fread( &b1, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound second block" ); - } - - ItemRead = fread( &b2, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound second block" ); - } - - // Two steps are necessary to please VC++ - // - // 2 pixels 12bit = [0xABCDEF] - // 2 pixels 16bit = [0x0ABD] + [0x0FCE] - // A B D - *destination++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f); - // F C E - *destination++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4); - - /// \todo JPR Troubles expected on Big-Endian processors ? - } -} -//-----------------------------------------------------------------------------