GDCM 3.0.24
GenFakeIdentifyFile.cxx
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmReader.h"
#include "gdcmGlobal.h"
#include "gdcmWriter.h"
#include "gdcmItem.h"
#include "gdcmAttribute.h"
#include "gdcmFile.h"
#include "gdcmTag.h"
#include "gdcmDict.h"
#include "gdcmDictEntry.h"
#include "gdcmDicts.h"
#include "gdcmAnonymizer.h"
#include <cstdlib>
#include <cstring>
gdcm::DataElement CreateFakeElement(gdcm::Tag const &tag, bool toremove)
{
static const gdcm::Dicts &dicts = g.GetDicts();
static const gdcm::Dict &pubdict = dicts.GetPublicDict();
static size_t countglobal = 0;
static std::vector<gdcm::Tag> balcptags =
size_t count = countglobal % balcptags.size();
const gdcm::DictEntry &dictentry = pubdict.GetDictEntry(tag);
de.SetTag( tag );
using gdcm::VR;
const VR &vr = dictentry.GetVR();
//if( vr != VR::INVALID )
if( vr.IsDual() )
{
if( vr == VR::US_SS )
{
de.SetVR( VR::US );
}
else if( vr == VR::US_SS_OW )
{
de.SetVR( VR::OW );
}
else if( vr == VR::OB_OW )
{
de.SetVR( VR::OB );
}
}
else
{
de.SetVR( vr );
}
const char str[] = "BasicApplicationLevelConfidentialityProfileAttributes";
const char safe[] = "This is safe to keep";
if( de.GetVR() != VR::SQ )
{
if( toremove )
de.SetByteValue( str, (uint32_t)strlen(str) );
else
de.SetByteValue( safe, (uint32_t)strlen(safe) );
}
else
{
// Create an item
// Insert sequence into data set
assert(de.GetVR() == gdcm::VR::SQ );
sq->SetLengthToUndefined();
de.SetValue(*sq);
//ds.Insert(de);
if( !toremove )
{
nds.Insert( CreateFakeElement( balcptags[count], true ) );
countglobal++;
}
else
{
gdcm::Attribute<0x0008,0x0000> at1 = { 0 }; // This element has no reason to be 'anonymized'...
nds.Insert( at1.GetAsDataElement() );
nds.Insert( at2.GetAsDataElement() );
}
sq->AddItem(it);
}
return de;
}
/*
*/
int main(int argc, char *argv[])
{
if( argc < 2 )
{
std::cerr << argv[0] << " output.dcm" << std::endl;
return 1;
}
using gdcm::Tag;
using gdcm::VR;
const char *outfilename = argv[1];
std::vector<gdcm::Tag> balcptags =
gdcm::File &f = w.GetFile();
// Add attribute that need to be anonymized:
std::vector<gdcm::Tag>::const_iterator it = balcptags.begin();
for(; it != balcptags.end(); ++it)
{
ds.Insert( CreateFakeElement( *it, true ) );
}
// Add attribute that do NOT need to be anonymized:
static const gdcm::Dicts &dicts = g.GetDicts();
static const gdcm::Dict &pubdict = dicts.GetPublicDict();
using gdcm::Dict;
Dict::ConstIterator dictit = pubdict.Begin();
for(; dictit != pubdict.End(); ++dictit)
{
const gdcm::Tag &dicttag = dictit->first;
if( dicttag == Tag(0x6e65,0x6146) ) break;
//const gdcm::DictEntry &dictentry = dictit->second;
ds.Insert( CreateFakeElement( dicttag, false ) );
}
ds.Remove( gdcm::Tag(0x400,0x500) );
ds.Remove( gdcm::Tag(0x12,0x62) );
ds.Remove( gdcm::Tag(0x12,0x63) );
// Make sure to override any UID stuff
gdcm::DataElement de( Tag(0x8,0x18) ); // SOP Instance UID
de.SetVR( VR::UI );
const char *u = uid.Generate();
de.SetByteValue( u, (uint32_t)strlen(u) );
//ds.Insert( de );
ds.Replace( de );
de.SetTag( Tag(0x8,0x16) ); // SOP Class UID
de.SetVR( VR::UI );
de.SetByteValue( ms.GetString(), (uint32_t)strlen(ms.GetString()));
ds.Replace( de ); // replace !
//fmi.SetDataSetTransferSyntax( gdcm::TransferSyntax::ImplicitVRLittleEndian );
w.SetFileName( outfilename );
if (!w.Write() )
{
return 1;
}
return 0;
}
static std::vector< Tag > GetBasicApplicationLevelConfidentialityProfileAttributes()
Return the list of Tag that will be considered when anonymizing a DICOM file.
Attribute class This class use template metaprograming tricks to let the user know when the template ...
Definition gdcmAttribute.h:86
DataElement GetAsDataElement() const
Definition gdcmAttribute.h:183
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
VR const & GetVR() const
Definition gdcmDataElement.h:84
void SetTag(const Tag &t)
Definition gdcmDataElement.h:71
void SetValue(Value const &vl)
Definition gdcmDataElement.h:100
void SetByteValue(const char *array, VL length)
Definition gdcmDataElement.h:126
void SetVR(VR const &vr)
Definition gdcmDataElement.h:88
Class to represent a Data Set (which contains Data Elements)
Definition gdcmDataSet.h:56
SizeType Remove(const Tag &tag)
Completely remove a dataelement from the dataset.
Definition gdcmDataSet.h:172
void Insert(const DataElement &de)
Definition gdcmDataSet.h:128
void Replace(const DataElement &de)
Replace a dataelement with another one.
Definition gdcmDataSet.h:150
Class to represent an Entry in the Dict.
Definition gdcmDictEntry.h:37
const VR & GetVR() const
Set/Get VR.
Definition gdcmDictEntry.h:53
Class to represent a map of DictEntry.
Definition gdcmDict.h:45
ConstIterator End() const
Definition gdcmDict.h:62
const DictEntry & GetDictEntry(const Tag &tag) const
Definition gdcmDict.h:75
ConstIterator Begin() const
Definition gdcmDict.h:61
Class to manipulate the sum of knowledge (all the dict user load)
Definition gdcmDicts.h:29
const Dict & GetPublicDict() const
Class to represent a File Meta Information.
Definition gdcmFileMetaInformation.h:41
void SetDataSetTransferSyntax(const TransferSyntax &ts)
a DICOM File
Definition gdcmFile.h:34
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
const FileMetaInformation & GetHeader() const
Get File Meta Information.
Definition gdcmFile.h:48
Global.
Definition gdcmGlobal.h:50
Dicts const & GetDicts() const
static Global & GetInstance()
return the singleton instance
Class to represent an Item.
Definition gdcmItem.h:46
const DataSet & GetNestedDataSet() const
Definition gdcmItem.h:80
MediaStorage.
Definition gdcmMediaStorage.h:44
@ RawDataStorage
Definition gdcmMediaStorage.h:85
Class to represent a Sequence Of Items.
Definition gdcmSequenceOfItems.h:40
Class for Smart Pointer.
Definition gdcmSmartPointer.h:40
Class to represent a DICOM Data Element (Attribute) Tag (Group, Element).
Definition gdcmTag.h:39
@ ExplicitVRLittleEndian
Definition gdcmTransferSyntax.h:64
Class for generating unique UID.
Definition gdcmUIDGenerator.h:28
const char * Generate()
VR class.
Definition gdcmVR.h:55
@ SQ
Definition gdcmVR.h:81
Writer ala DOM (Document Object Model)
Definition gdcmWriter.h:49
File & GetFile()
Definition gdcmWriter.h:67
void SetCheckFileMetaInformation(bool b)
Undocumented function, do not use (= leave default)
Definition gdcmWriter.h:70
virtual bool Write()
Main function to tell the writer to write.
void SetFileName(const char *filename_native)
Set the filename of DICOM file to write: