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