|
9 | 9 | import getpass |
10 | 10 | from io import BytesIO |
11 | 11 |
|
12 | | -from PIL import Image |
13 | 12 | import pydicom |
14 | | -import numpy as np |
15 | 13 |
|
16 | 14 | from dicomweb_client.api import DICOMwebClient, load_json_dataset |
17 | 15 | from dicomweb_client.log import configure_logging |
@@ -440,16 +438,6 @@ def _save_metadata(data, directory, sop_instance_uid, prettify=False, |
440 | 438 | json.dump(data, f, sort_keys=True) |
441 | 439 |
|
442 | 440 |
|
443 | | -def _save_image(image, filename): |
444 | | - logger.info('save pixel data to file "{}"'.format(filename)) |
445 | | - image.save(filename) |
446 | | - |
447 | | - |
448 | | -def _show_image(image): |
449 | | - logger.info('show pixel data') |
450 | | - image.show() |
451 | | - |
452 | | - |
453 | 441 | def _print_pixel_data(pixels): |
454 | 442 | logger.info('print pixel data') |
455 | 443 | print(pixels) |
@@ -596,35 +584,34 @@ def _retrieve_instance_frames(client, args): |
596 | 584 | image media types. |
597 | 585 | ''' |
598 | 586 | pixel_data = client.retrieve_instance_frames( |
599 | | - args.study_instance_uid, args.series_instance_uid, |
600 | | - args.sop_instance_uid, args.frame_numbers, |
| 587 | + args.study_instance_uid, |
| 588 | + args.series_instance_uid, |
| 589 | + args.sop_instance_uid, |
| 590 | + args.frame_numbers, |
601 | 591 | media_types=args.media_types, |
602 | 592 | ) |
603 | 593 |
|
604 | 594 | for i, data in enumerate(pixel_data): |
605 | | - if args.save or args.show: |
606 | | - try: |
607 | | - image = Image.open(BytesIO(data)) |
608 | | - except Exception: |
609 | | - try: |
610 | | - import jpeg_ls |
611 | | - image = jpeg_ls.decode(np.fromstring(data, dtype=np.uint8)) |
612 | | - except Exception: |
613 | | - raise IOError( |
614 | | - 'Cannot load retrieved frame as an image.' |
615 | | - ) |
616 | | - if args.save: |
617 | | - filename = ( |
618 | | - '{sop_instance_uid}_{frame_number}.{extension}'.format( |
619 | | - sop_instance_uid=args.sop_instance_uid, |
620 | | - frame_number=args.frame_numbers[i], |
621 | | - extension=image.format.lower() |
622 | | - ) |
| 595 | + if args.save: |
| 596 | + if data[:2] == b'\xFF\xD8': # SOI marker => JPEG |
| 597 | + if data[2:4] == b'\xFF\xF7': # SOF 55 marker => JPEG-LS |
| 598 | + extension = 'jls' |
| 599 | + else: |
| 600 | + extension = 'jpg' |
| 601 | + elif data[:2] == b'\xFF\x4F': # SOC marker => JPEG 2000 |
| 602 | + extension = 'jp2' |
| 603 | + else: |
| 604 | + extension = 'dat' |
| 605 | + filename = ( |
| 606 | + '{sop_instance_uid}_{frame_number}.{extension}'.format( |
| 607 | + sop_instance_uid=args.sop_instance_uid, |
| 608 | + frame_number=args.frame_numbers[i], |
| 609 | + extension=extension |
623 | 610 | ) |
624 | | - filepath = os.path.join(args.output_dir, filename) |
625 | | - _save_image(image, filepath) |
626 | | - elif args.show: |
627 | | - _show_image(image) |
| 611 | + ) |
| 612 | + filepath = os.path.join(args.output_dir, filename) |
| 613 | + with open(filepath, 'bw') as fp: |
| 614 | + fp.write(data) |
628 | 615 | else: |
629 | 616 | _print_pixel_data(data) |
630 | 617 |
|
|
0 commit comments