Mercurial > hg > orthanc-book
annotate Sphinx/source/plugins/python/pil-conversions.py @ 1113:a588960a72e5 default tip
spelling
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 28 Oct 2024 09:23:08 +0100 |
parents | 1316bc62b5d5 |
children |
rev | line source |
---|---|
706
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 import json |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 import PIL.Image |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 import PIL.ImageDraw |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 import orthanc |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 |
991
1316bc62b5d5
migration to UCLouvain servers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
977
diff
changeset
|
6 URL = 'https://orthanc.uclouvain.be/hg/orthanc-tests/raw-file/Orthanc-1.11.0/Database/LenaTwiceWithFragments.dcm' |
706
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 USERNAME = '' |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 PASSWORD = '' |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 def OnChange(changeType, level, resource): |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 if changeType == orthanc.ChangeType.ORTHANC_STARTED: |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 # (1) Download a sample DICOM instance and decode it |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 orthanc.LogWarning('Downloading: %s' % URL) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 lena = orthanc.HttpGet(URL, USERNAME, PASSWORD) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 dicom = orthanc.CreateDicomInstance(lena) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 orthanc.LogWarning('Number of frames: %d' % dicom.GetInstanceFramesCount()) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 # (2) Access the first frame of the instance as a PIL image |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 frame = dicom.GetInstanceDecodedFrame(0) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 size = (frame.GetImageWidth(), frame.GetImageHeight()) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 if frame.GetImagePixelFormat() == orthanc.PixelFormat.RGB24: |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 mode = 'RGB' |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 else: |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 raise Exception('Unsupported pixel format') |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
28 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
29 image = PIL.Image.frombuffer(mode, size, frame.GetImageBuffer(), 'raw', mode, 0, 1) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 # (3) Draw a red cross over the PIL image |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 draw = PIL.ImageDraw.Draw(image) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 draw.line((0, 0) + image.size, fill=(255,0,0), width=10) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 draw.line((0, image.size[1], image.size[0], 0), fill=(255,0,0), width=10) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 # (4) Convert back the modified PIL image to an Orthanc image |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 buf = image.tobytes() |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 a = orthanc.CreateImageFromBuffer(frame.GetImagePixelFormat(), image.size[0], image.size[1], |
977
caf69d2ee070
fix Sphinx/source/plugins/python/pil-conversions.py
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
842
diff
changeset
|
39 len(buf) // image.size[1], buf) |
706
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 # (5) Create and upload a new DICOM instance with the modified frame |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 tags = { |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 'SOPClassUID' : '1.2.840.10008.5.1.4.1.1.1', |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 'PatientID' : 'HELLO', |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 'PatientName' : 'WORLD', |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 } |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 s = orthanc.CreateDicom(json.dumps(tags), a, orthanc.CreateDicomFlags.GENERATE_IDENTIFIERS) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 orthanc.RestApiPost('/instances', s) |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 orthanc.LogWarning('Image successfully modified and uploaded!') |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 |
c62539d00251
Conversions between Orthanc and Python images
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
52 orthanc.RegisterOnChangeCallback(OnChange) |