2016-12-10 8 views
0

ich folgende Python-Code verwendet, um eine DICOM-Datei mit GDCM zu komprimieren:Handle C Behauptungen von Python

import gdcm 

    reader = gdcm.PixmapReader() 
    reader.SetFileName(str(source)) 
    if not reader.Read(): 
     raise BaseException("Could not read (pixmap) %s" % source) 
    image = reader.GetPixmap() 
    change = gdcm.ImageChangeTransferSyntax() 
    change.SetForce(False) 
    change.SetCompressIconImage(False) 
    transfer_syntax = gdcm.TransferSyntax(gdcm.TransferSyntax.JPEG2000Lossless) 
    change.SetTransferSyntax(transfer_syntax) 
    change.SetInput(image) 
    if not change.Change(): 
     raise BaseException("Could not change the Transfer Syntax: ") 
    .... 

In der Zeile change.Change(), gibt es eine Behauptung in GDCM Quelle die möglicherweise faile:

Assertion `((fragment_size + 1)/2) * 2 == ((image_height * image_width * numcomps * (bitsallocated/8) + 1)/ 2)* 2' failed. 

Leider würde der Python-Prozess im Falle eines Assertionsfehlers bei GDCM beendet werden. Gibt es eine Möglichkeit, solche Behauptungen zu behandeln (ohne die Bedingungen bei Python vor dem Aufruf von change.Change() überprüft zu haben)?

+0

Haben Sie versucht, mit einem Exception-Handler: so etwas wie: 'versuchen: change.Change(); außer Assertion: ... ' –

+0

@LaurentLAPORTE: C-Behauptungen funktionieren nicht so. – user2357112

+0

Dieses 'assert' wird für einen Programmierfehler ausgelöst, können Sie das Problem mit einem öffentlich verfügbaren DICOM-Datensatz reproduzieren? – malat

Antwort

0

Zögernd überprüfte ich die Dicom Integrität pydicom vor Komprimieren Dicom mit:

def check_dicom(dicom_file): 
    p = dicom.read_file(dicom_file) 
    assert p.SamplesPerPixel in (1, 3) 
    if p.BitsAllocated % 8 != 0: 
     return False 

    # assert(((fragment_size + 1)/2) * 2 == ((image_height * image_width * numcomps * (bitsallocated/8) + 1)/ 2)* 2); 
    left = ((len(p.PixelData) + 1)/2) * 2 
    right = ((p.Rows * p.Columns * p.SamplesPerPixel * (p.BitsAllocated/8) + 1)/ 2)* 2 
    if left != right: 
     raise BaseException("DICOM attributes are in conflict with pixel data size") 
    return True 
1

Ein Weg, dies zu behandeln, ist einen untergeordneten Prozess zu starten, um die C-Bibliothek aufzurufen, und dann eine Ausnahme auszulösen, wenn der untergeordnete Prozess wegen einer C-Anweisung asyst abstirbt.