Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
dcmodify(1)			   OFFIS DCMTK			     dcmodify(1)

NAME
     dcmodify - Modify DICOM files

SYNOPSIS
     dcmodify [options] dcmfile-in...

DESCRIPTION
     dcmodify  is  a  tool that allows one to modify, insert and delete tags and
     items in DICOM files. Sequences and tags with a value multiplicity > 1  are
     also supported. Metaheader information and the tag's VR can not be modified
     directly by dcmodify at this time. In addition to tag modifications, dcmod-
     ify makes available some input options - forcing dcmodify to handle its in-
     put  files as the user specifies - and output options to control the output
     format of the resulting files.

     In case multiple modifications have to be performed, dcmodify does the mod-
     ifications in the same order as they appear on  the  command  line.  Please
     note  that  dcmodify does not check whether a given value matches its value
     representation (VR). Usually, an error message is printed but generally the
     user should take care of the right VR usage.

     If dcmodify doesn't know the tag it should insert, then the tag's VR is set
     to UN and the value provided on command line is interpreted as being a  se-
     ries  of hexadecimal numbers (like they are provided for VR=OB). Please in-
     sert these tags into the dictionary to avoid this behavior. Also,	specify-
     ing  the  -iun  option, it is possible to force dcmodify to leave UN values
     untouched. Using option -u lets dcmodify saving all VR=UN attributes as OB.

     dcmodify is able to work with so-called tag paths to  access  tags  in  se-
     quences. The (pseudo-formalized) syntax is

     {sequence[item-no].}*element

     where  'sequence'	is  a sequence tag like (0008,1111) or a dictionary name
     for a tag. 'item-no' describes the item number  to  be  accessed  (counting
     from  zero).  'element' defines the target tag to work on. A tag can either
     be specified directly as (0010,0010) or through the  corresponding  dictio-
     nary  name  'PatientName'.  The  '*'  denotes  that you can repeat sequence
     statements to access deeper levels in DICOM files (see  EXAMPLES  section).
     For  'item-no',  also  a  wildcard  character '*' can be used selecting all
     items in surrounding sequence (see section WILDCARDS below).

     When inserting tag paths consisting of multiple nodes (i.e.  not  a  single
     element)  using the -i option, any missing path elements (items, sequences,
     leaf elements) are inserted automatically when missing. That does not  work
     for  item wildcards: When no single item exists in the surrounding sequence
     dcmodify of course can't decide, how many items should be	generated.  How-
     ever,  if	specifying  an	item  number like '5', all 6 items (counted from
     zero) can be (and are) automatically generated in insert mode. If already 2
     items would exist, the rest (4) would be inserted.

     dcmodify does not work on directories,  i.e.  the	parameter  dcmfile-in...
     must not include directory names.

     Please  note that there are some issues concerning the modification of pri-
     vate tags (see PRIVATE TAGS section) and for changing UIDs  (CHANGING  UIDs
     section).

PARAMETERS
     dcmfile-in  DICOM input filename(s) to be modified ("-" for stdin/stdout)

OPTIONS
   general options
       -h    --help
	       print this help text and exit

	     --version
	       print version information and exit

	     --arguments
	       print expanded command line arguments

       -q    --quiet
	       quiet mode, print no warnings and errors

       -v    --verbose
	       verbose mode, print processing details

       -d    --debug
	       debug mode, print debug information

       -ll   --log-level  [l]evel: string constant
	       (fatal, error, warn, info, debug, trace)
	       use level l for the logger

       -lc   --log-config  [f]ilename: string
	       use config file f for the logger

   input options
     input file format:

       +f    --read-file
	       read file format or data set (default)

       +fo   --read-file-only
	       read file format only

       -f    --read-dataset
	       read data set without file meta information

       +fc   --create-file
	       create file format if file does not exist

     input transfer syntax:

       -t=   --read-xfer-auto
	       use TS recognition (default)

       -td   --read-xfer-detect
	       ignore TS specified in the file meta header

       -te   --read-xfer-little
	       read with explicit VR little endian TS

       -tb   --read-xfer-big
	       read with explicit VR big endian TS

       -ti   --read-xfer-implicit
	       read with implicit VR little endian TS

     parsing of odd-length attributes:

       +ao   --accept-odd-length
	       accept odd length attributes (default)

       +ae   --assume-even-length
	       assume real length is one byte larger

     automatic data correction:

       +dc   --enable-correction
	       enable automatic data correction (default)

       -dc   --disable-correction
	       disable automatic data correction

     bitstream format of deflated input:

       +bd   --bitstream-deflated
	       expect deflated bitstream (default)

       +bz   --bitstream-zlib
	       expect deflated zlib bitstream

   processing options
     backup input files:

	     --backup
	       backup files before modifying (default)

       -nb   --no-backup
	       don't backup files (DANGEROUS)

     insert mode:

       -i    --insert  "[t]ag-path=[v]alue"
	       insert (or overwrite) path at position t with value v

       -if   --insert-from-file  "[t]ag-path=[f]ilename"
	       insert (or overwrite) path at position t with value from file f

       -nrc  --no-reserv-check
	       do not check private reservations

     modify mode:

       -m    --modify  "[t]ag-path=[v]alue"
	       modify tag at position t to value v

       -mf   --modify-from-file  "[t]ag-path=[f]ilename"
	       modify tag at position t to value from file f

       -ma   --modify-all  "[t]ag=[v]alue"
	       modify ALL matching tags t in file to value v

     erase mode:

       -e    --erase  "[t]ag-path"
	       erase tag/item at position t

       -ea   --erase-all  "[t]ag"
	       erase ALL matching tags t in file

       -ep   --erase-private
	       erase ALL private data from file

     unique identifier:

       -gst  --gen-stud-uid
	       generate new Study Instance UID

       -gse  --gen-ser-uid
	       generate new Series Instance UID

       -gin  --gen-inst-uid
	       generate new SOP Instance UID

       -nmu  --no-meta-uid
	       do not update metaheader UIDs if related
	       UIDs in the dataset are modified

     error handling:

       -ie   --ignore-errors
	       continue with file, if modify error occurs

       -imt  --ignore-missing-tags
	       treat 'tag not found' as success
	       when modifying or erasing in files

       -iun  --ignore-un-values
	       do not try writing any values to elements
	       having a VR of UN

   output options
     output file format:

       +F    --write-file
	       write file format (default)

       -F    --write-dataset
	       write data set without file meta information

     output transfer syntax:

       +t=   --write-xfer-same
	       write with same TS as input (default)

       +te   --write-xfer-little
	       write with explicit VR little endian TS

       +tb   --write-xfer-big
	       write with explicit VR big endian TS

       +ti   --write-xfer-implicit
	       write with implicit VR little endian TS

     post-1993 value representations:

       +u    --enable-new-vr
	       enable support for new VRs (UN/UT) (default)

       -u    --disable-new-vr
	       disable support for new VRs, convert to OB

     group length encoding:

       +g=   --group-length-recalc
	       recalculate group lengths if present (default)

       +g    --group-length-create
	       always write with group length elements

       -g    --group-length-remove
	       always write without group length elements

     length encoding in sequences and items:

       +le   --length-explicit
	       write with explicit lengths (default)

       -le   --length-undefined
	       write with undefined lengths

     data set trailing padding (not with --write-dataset):

       -p=   --padding-retain
	       do not change padding (default if not --write-dataset)

       -p    --padding-off
	       no padding (implicit if --write-dataset)

       +p    --padding-create  [f]ile-pad [i]tem-pad: integer
	       align file on multiple of f bytes and items on
	       multiple of i bytes

PRIVATE TAGS
     There  are some issues you have to consider when working with private tags.
     However, the insertion or modification of	a  reservation	tag  (gggg,00xx)
     should always work.

   Insertions
     If  you wish to insert a private tag (not a reservation with gggg,00xx), be
     sure, that you've listed it in your dictionary  (see  <docdir>/datadict.txt
     for details). If it's not listed, dcmodify will insert it with VR=UN. Also,
     for some cases insertion may even fail for some values.

     If you've got your private tag in the dictionary, dcmodify acts as follows:
     When  it  finds a reservation in the tag's enclosing dataset, whose private
     creator matches, insertion is done with the VR found in the dictionary  and
     the  value  given on command line. But if the private creator doesn't match
     or none is set, dcmodify will return with an error. If a private tag should
     be inserted regardless whether a reservation does	not  exist,  the  option
     -nrc  can be used, forcing an insertion. However, the VR is set to UN then,
     because the tag then cannot be found in the dictionary.

     See description above how inserting values into elements  with  unknown  VR
     are handled.

   Modifications
     If you modify a private tags value, dcmodify won't check its VR against the
     dictionary.  So please be careful to enter only values that match the tag's
     VR.

     If you wish to change a private tags value and VR, because you  just  added
     this  tag to your dictionary, you can delete it with dcmodify and re-insert
     it. Then dcmodify uses your dictionary entry  to  determine  the  right  VR
     (also see subsection insertions).

     Also, see description above how inserting values into elements with unknown
     VR are handled.

   Deletions
     When you use dcmodify to delete a private reservation tag, please note that
     dcmodify  won't touch the private tags that are under this reservation. The
     user is forced to handle the consistency between reservations and their as-
     sociated private tags.

     For the deletion of private non-reservation tags there are no  special  is-
     sues.

CHANGING UIDS
     dcmodify  will automatically correct 'Media Storage SOP Class UID' and 'Me-
     dia Storage SOP Instance UID' in the metaheader, if you make changes to the
     related tags in the dataset ('SOP Class UID' and 'SOP  Instance  UID')  via
     insert  or  modify mode options. You can disable this behavior by using the
     -nmu option.

     If you generate new UID's with -gst, -gse or -gin, this  will  only  affect
     the  UID you chose to generate. So if you use -gst to generate a new 'Study
     Instance UID', then 'Series Instance UID' and 'SOP Instance UID'  will  not
     be  affected!  This  gives you the possibility to generate each value sepa-
     rately. Normally, you would also modify the 'underlying' UIDs. As a  disad-
     vantage  of  this	flexibility,  the user has to assure, that when creating
     'new' DICOM files with new UIDs with dcmodify, other UIDs have  to  be  up-
     dated by the user as necessary.

     When  choosing  the -gin option, the related metaheader tag ('Media Storage
     SOP Instance UID') is updated automatically. This behavior cannot	be  dis-
     abled.

     When  working on multiple input files, dcmodify processes each file in iso-
     lated fashion, i.e. it will generate UIDs for each single file.  For  exam-
     ple, when using the -gst option, dcmodify will insert a different Study In-
     stance UID into each file instead of generating a single one and writing it
     to each file that is being processed.

CREATING NEW FILES
     Option --create-file lets dcmodify create a file if it does not already ex-
     ist on disk. This can be used in order to create files from scratch by per-
     forming consecutive insertions with options like --insert. This might espe-
     cially  become  handy  when  creating query files for tools like findscu or
     movescu. In case no specific output transfer syntax  is  defined,	dcmodify
     chooses  Little  Endian  Explicit	Uncompressed  for output. Files that are
     newly created are always written as DICOM file format, i.e. option --write-
     dataset is not permitted together with --create. This  way,  at  least  the
     metaheader  is  written  and  no file with zero byte length is created in a
     case where no insertions are performed in the dcmodify call.

ELEMENT VALUES FROM FILE
     In order to read the element value from a file instead of specifying it  on
     the  command  line, option -mf and -if can be used. Please note that for OW
     elements, the data is expected to be little  endian  ordered  and	will  be
     swapped  if  necessary.  The  file  size should always be an even number of
     bytes, i.e. no automatic padding is performed.

WILDCARDS
     dcmodify also permits the usage of a wildcard character '*' for  item  num-
     bers  in  path expressions, e.g. 'ContentSequence[*].CodeValue' selects all
     'Code Value' attributes in all items of the ContentSequence. Using a  wild-
     card  is possible for all basic operations, i.e. modifying -m, inserting -i
     and -e options which makes it, together with the automatic creation of  in-
     termediate  path nodes a powerful tool for construction and processing com-
     plex datasets.

     The options -ma and -ea for modifying or deleting all occurrences of a  DI-
     COM  element  based on its tag do not accept any wildcards but only work on
     single elements (i.e. a single dictionary name or tag key).

EXAMPLES
     -i   --insert:
	    dcmodify -i "(0010,0010)=A Name" file.dcm
	    Inserts the PatientName tag into 'file.dcm' at 1st level.
	    If tag already exists, -i will overwrite it!  If you want to
	    insert an element with value multiplicity > 1 (e.g. 4) you
	    can do this with: dcmodify -i "(0018,1310)=1\2\3\4"

	    dcmodify -i "(0008,1111)[0].PatientName=Another Name" *.dcm
	    Inserts PatientName tag into the first item of sequence
	    (0008,1111).  Note that the use of wildcards for files is
	    possible.  You can specify longer tag paths, too (e.g.
	    "(0008,1111)[0].(0008,1111)[1].(0010,0010)=A Third One").
	    If any part of the path, e.g. the sequence or the item "0"
	    does not exist, it is automatically inserted by dcmodify.

	    dcmodify -i "(0008,1111)[*].PatientName=Another Name" *.dcm
	    Inserts PatientName tag into _every_ item of sequence
	    (0008,1111).  Note that the use of wildcards for files is
	    possible.  You can specify longer tag paths, too (e.g.
	    "(0008,1111)[*].(0008,1111)[*].(0010,0010)=A Third One").

     -if  --insert-from-file:
	    dcmodify -if "PixelData=pixel.raw" file.dcm
	    Inserts the content of file 'pixel.raw' into the PixelData element
	    of 'file.dcm'.  The contents of the file will be read as is.
	    OW data is expected to be little endian ordered and will be
	    swapped if necessary.  No checks will be made to ensure that the
	    amount of data is reasonable in terms of other attributes such as
	    Rows or Columns.

     -m   --modify:
	    dcmodify -m "(0010,0010)=A Name" file.dcm
	    Changes tag (0010,0010) on 1st level to "A Name".

	    This option also permits longer tag paths as demonstrated above
	    for -i. If the leaf element or any intermediate part of the path
	    does not exist, it is not inserted as it would be if using the
	    '-i' option.

	    dcmodify -m "(0010,0010)=A Name" -imt file.dcm
	    Changes tag (0010,0010) on 1st level to "A Name". Due to the given
	    option '-imt', success is returned instead of "tag not found", if
	    the element/item (or any intermediate node in a longer path) does
	    not exist.

	    Note that for the '-m' option the last node in the path must be a
	    leaf element, i.e. not a sequence or an item.

     -mf  --modify-from-file:
	    dcmodify -mf "PixelData=pixel.raw" file.dcm
	    Does the same as -if in case there was already a PixelData element
	    in 'file.dcm'.  Otherwise nothing is changed.

     -ma  --modify-all:
	    dcmodify -ma "(0010,0010)=New Name" file.dcm
	    Does the same as -m but works on all matching tags found in
	    'file.dcm'.  Therefore, it searches the whole dataset including
	    sequences for tag (0010,0010) and changes them to "New Name"

     -e   --erase:
	    dcmodify -e "(0010,0010)" *.dcm
	    Erases tag (0010,0010) in all *.dcm files at 1st level.

	    This option also allows longer tag paths as demonstrated
	    above for -i.

	    dcmodify -e "(0010,0010)" -imt *.dcm
	    Erases tag (0010,0010) in all *.dcm files at 1st level. Due to the
	    given option '-imt', success is returned instead of "tag not
	    found", if the element/item (or any intermediate node in a longer
	    path) does not exist.

     -ea  --erase-all:
	    dcmodify -ea "(0010,0010)" *.dcm
	    Same as -e, but also searches in sequences and items.

     -ep  --erase-private:
	    dcmodify -ep *.dcm
	    Deletes all private tags (i.e. tags having an odd group number)
	    from all files matching *.dcm in the current directory.

     -gst --gen-stud-uid:
	    dcmodify -gst file.dcm
	    This generates a new value for the StudyInstanceUID (0020,000d).
	    Other UIDs are not modified!

     -gse --gen-ser-uid:
	    dcmodify -gse file.dcm
	    This generates a new value for the SeriesInstanceUID (0020,000e).
	    Other UIDs are not modified!

     -gin --gen-inst-uid:
	    dcmodify -gin file.dcm
	    This command generates a new value for the SOPInstanceUID
	    (0008,0018).  The corresponding MediaStorageSOPInstanceUID
	    (0002,0003) is adjusted to the new value automatically.
	    Please note that it's not possible to avoid this metaheader
	    update via the -nmu option.

     -nmu --no-meta-uid:
	    dcmodify -m "SOPInstanceUID=[UID]" -nmu *.dcm
	    This will modify the SOPInstanceUID to the given [UID], but -nmu
	    avoids, that dcmodify adjusts the MediaStorageSOPInstanceUID in
	    the metaheader, too.

ERROR HANDLING
     dcmodify tries executing each modify operation given on  command  line:  If
     one  returns  an  error,  the others are being performed anyway. However in
     case of any error, the modified file is not saved, unless the  --ignore-er-
     rors option is specified. If that option is selected, dcmodify also contin-
     ues  modifying  further files specified on command line; otherwise dcmodify
     exits after the first file that had modification errors.

     If the --ignore-missing-tags option is enabled, any modify or erase  opera-
     tions  (i.e.  not	--insert)  that  fails	because of a non-existing tag is
     treated as being successful. That does make sense if someone  wants  to  be
     sure that specific tags are not present in the file or that - if they exist
     - that they are set to a specific value.

LOGGING
     The  level of logging output of the various command line tools and underly-
     ing libraries can be specified by the user. By  default,  only  errors  and
     warnings  are  written to the standard error stream. Using option --verbose
     also informational messages like processing details  are  reported.  Option
     --debug  can be used to get more details on the internal activity, e.g. for
     debugging purposes. Other logging	levels	can  be  selected  using  option
     --log-level.  In  --quiet mode only fatal errors are reported. In such very
     severe error events, the application will usually terminate. For  more  de-
     tails on the different logging levels, see documentation of module 'oflog'.

     In  case the logging output should be written to file (optionally with log-
     file rotation), to syslog (Unix) or the event log (Windows)  option  --log-
     config  can be used. This configuration file also allows for directing only
     certain messages to a particular output stream and  for  filtering  certain
     messages  based  on  the module or application where they are generated. An
     example configuration file is provided in <etcdir>/logger.cfg.

COMMAND LINE
     All command line tools use the following notation	for  parameters:  square
     brackets  enclose	optional values (0-1), three trailing dots indicate that
     multiple values are allowed (1-n), a combination of both means 0 to n  val-
     ues.

     Command  line options are distinguished from parameters by a leading '+' or
     '-' sign, respectively. Usually, order and position of command line options
     are arbitrary (i.e. they can appear anywhere). However, if options are  mu-
     tually  exclusive	the rightmost appearance is used. This behavior conforms
     to the standard evaluation rules of common Unix shells.

     In addition, one or more command files can be specified using an  '@'  sign
     as a prefix to the filename (e.g. @command.txt). Such a command argument is
     replaced  by  the	content  of the corresponding text file (multiple white-
     spaces are treated as a single separator unless  they  appear  between  two
     quotation	marks)	prior to any further evaluation. Please note that a com-
     mand file cannot contain another command file. This  simple  but  effective
     approach  allows one to summarize common combinations of options/parameters
     and avoids longish and confusing command lines (an example is  provided  in
     file <datadir>/dumppat.txt).

ENVIRONMENT
     The dcmodify utility will attempt to load DICOM data dictionaries specified
     in  the  DCMDICTPATH environment variable. By default, i.e. if the DCMDICT-
     PATH environment variable is not set, the file <datadir>/dicom.dic will  be
     loaded  unless  the  dictionary  is built into the application (default for
     Windows).

     The default behavior should be preferred and  the	DCMDICTPATH  environment
     variable  only  used  when  alternative data dictionaries are required. The
     DCMDICTPATH environment variable has the same format as the Unix shell PATH
     variable in that a colon (':') separates entries.	On  Windows  systems,  a
     semicolon	(';')  is used as a separator. The data dictionary code will at-
     tempt to load each file specified in the DCMDICTPATH environment  variable.
     It is an error if no data dictionary can be loaded.

COPYRIGHT
     Copyright	(C)  2003-2025 by OFFIS e.V., Escherweg 2, 26121 Oldenburg, Ger-
     many.

Version 3.7.0			 Mon Dec 15 2025		     dcmodify(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=dcmodify&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help