[Dcmlib] Ecriture DICOM sur Big Endian
Jean-Pierre ROUX
jean-pierre.roux at creatis.insa-lyon.fr
Tue Jan 11 04:42:24 CET 2005
At 18:33 -0500 10/01/05, Mathieu Malaterre wrote:
>Mathieu Malaterre wrote:
>>Ok,
>>
>> J'y vois plus clair. Les problemes obscurs sur MacOSX sont
>>regles. Je passe donc au probleme d'ecriture sur Big Endian. Qui a
>>mon avis n'a pas du tout ete traite.
>>
>> Ma question est qu'est ce qu'il vaut mieux :
>>- Ecrire l'entete en declarant l'image little endian, puis swap
>>l'enorme image buffer en little endian.
>>
>>- Soit modifier l'entete DICOM pour dire que l'on est effectivement
>>sur big endian et dans ce cas pas besoin de reswaper le buffer
>>avant ecriture.
C'est la deuxieme option que j'avais prise dans la version 'été 2003'
(pour des raisons de rapidité a l'execution)
Ca faisait des images relisibles ... par gdcm.
En fait, pour une 'vraie' image DICOM Explicit Big Endian, le groupe
0002 doit etre ecrit imperativement en little-endian, et le reste en
big-endian
C'est pour cela que le group 0002 est le seul dont l'element 0000
(group length) soit obligatoire.
Et, faute d'avoir eu entre les mains une 'vraie' image DICOM
big-endian, on a completement zappe ce problème, et on est assures
que la version actuelle de gdcm petera lorsqu'on aura une image DICOM
big-endian (pour les images ACR-NEMA, il n'y pas de pb).
En effet, on ne teste jamais la 'Transfert Syntax' pour des pb
d'endiannity.On se contente de 'deviner', en examinant le debut de
l'entete, si l'image est compatible avec le processeur, ou s'il faut
swapper les int16 et les int32 (on positionne alors le SwapCode).
Dans le cas d'une 'vraie' image DICOM Big Endian, la conclusion qu'on
tirera de cas sera vraie pour le group 0002, et fausse pour tous les
autres.
Pour corriger ca, il faudra, *lors du parsing* d'une 'vraie' image
DICOM, aussitot que le groupe lu n'est plus 0002, tester la Transfert
Syntax, et, si c'est 'Big Endian', changer le SwapCode, dont la
valeur donnée par l'heuristique est desormais fausse, à coup sur.
Et on n'a donc plus besoin de ma methode 'IsCurrentProcessorBigEndEndian'.
Voila.
J'ai bien fait de prendre un peu de temps pour t'expliquer le pb.
Ca m'a eclairci les idées.
Tout ca est bien plus simple que ce que j'avais commence a ecrire
(s'arreter de lire lorsque la longueur du group 0002 est atteinte,
comparer la Transfert Syntax a l'endiannity du processeur, etc)
Je commiterai ca demain matin (enfin ... tout a l'heure).
Le probleme de l'ecriture en Big Endian va etre + simple que ce qu'on
pouvait craindre :
Il suffit d'ecrire le group 0002 (et celui ci seulement) en faisant
le contraire de ce qu'on avait prévu de faire, et de continuer
'normalement' pour le reste de l'image.
Pour la lecture des fichiers ACR-NEMA, il n'y a pas de problème : la
norme disait que c'etait *imperativement* du little-endian; personne
ne se sentait tenu de la respecter; les images n'etaient pas
relisibles d'un constructeur a l'autre; l'heuristique marchait tres
bien, tout le temps ....
JP
>
>En fait la question se pose pas. Les deux sont parfaitement valable.
>Je fais les deux donc.
>
>Ca serait pas mal une function dans gdcmTS qui a une syntax little
>endian me renvoi l'equivalente big endian.
>
>Mathieu
>
>
>_______________________________________________
>Dcmlib mailing list
>Dcmlib at creatis.insa-lyon.fr
>http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
Jean-Pierre ROUX
UMR CNRS 5515-CREATIS
Laboratoire de Radiologie Experimentale
Hopital Cardiologique
28 Avenue du Doyen LEPINE
B.P. Lyon-Montchat
69394 Lyon Cedex 03
Tel : (+33) 04 72 35 74 12
Fax : (+33) 04 72 68 49 16
URL : http://www.creatis.univ-lyon1.fr
e-mail : jpr at creatis.univ-lyon1.fr
More information about the Dcmlib
mailing list