]> Creatis software - gdcm.git/blob - src/gdcmJpeg2000.cxx
ENH: Adding support for multiple fragments of jpeg2000... this is SO ugly...
[gdcm.git] / src / gdcmJpeg2000.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: gdcmJpeg2000.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/05/30 01:30:39 $
7   Version:   $Revision: 1.21 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 #include "gdcmFileHelper.h"
19 #include "gdcmDebug.h"
20
21 #include <iostream>
22 #include <fstream>
23 #include <jasper/jasper.h>
24
25 namespace gdcm 
26 {
27 //-----------------------------------------------------------------------------
28  /**
29  * \brief   routine for JPEG decompression 
30  * @param fp pointer to an already open file descriptor 
31  *                      JPEG2000 encoded image
32  * @param image_buffer to receive uncompressed pixels
33  * @return 1 on success, 0 on error
34  * @warning : not yet made
35  */
36
37 bool gdcm_read_JPEG2000_file (void* raw, char *inputdata, size_t inputlength)
38 {
39   jas_init(); //important...
40   jas_stream_t *jasStream = 
41     jas_stream_memopen((char *)inputdata, inputlength);
42     
43   int fmtid;
44   if ((fmtid = jas_image_getfmt(jasStream)) < 0) 
45     {
46     gdcmErrorMacro("unknown image format");
47     return false;
48     }
49
50   // Decode the image. 
51   jas_image_t *jasImage = NULL;
52   if (!(jasImage = jas_image_decode(jasStream, fmtid, 0))) 
53     {
54     gdcmErrorMacro("cannot decode image");
55     return false;
56     }
57
58   // close the stream. 
59   jas_stream_close(jasStream);
60   int numcmpts = jas_image_numcmpts(jasImage);
61   int width = jas_image_cmptwidth(jasImage, 0);
62   int height = jas_image_cmptheight(jasImage, 0);
63   int prec = jas_image_cmptprec(jasImage, 0);
64   int i, j, k;
65   char *fmtname = jas_image_fmttostr(fmtid);
66   printf("%s %d %d %d %d %ld\n", fmtname, numcmpts, width, height, prec, (long) jas_image_rawsize(jasImage));
67
68   // The following should serioulsy be rewritten I cannot belive we need to
69   // do a per pixel decompression, there should be a way to read a full
70   // scanline...
71   if (prec == 8)
72     {
73     uint8_t *data8 = (uint8_t*)raw;
74     for ( i = 0; i < height; i++)
75       for ( j = 0; j < width; j++)
76         for ( k= 0; k < numcmpts; k++)
77           *data8++ =
78             (uint8_t)(jas_image_readcmptsample(jasImage, k, j ,i ));
79     }
80   else if (prec <= 16)
81     {
82     uint16_t *data16 = (uint16_t*)raw;
83     for ( i = 0; i < height; i++) 
84       for ( j = 0; j < width; j++) 
85         for ( k= 0; k < numcmpts; k++)
86           *data16++ = 
87             (uint16_t)(jas_image_readcmptsample(jasImage, k, j ,i ));
88     }
89   else if (prec <= 32)
90     {
91     uint32_t *data32 = (uint32_t*)raw;
92     for ( i = 0; i < height; i++) 
93       for ( j = 0; j < width; j++) 
94         for ( k= 0; k < numcmpts; k++)
95           *data32++ = 
96             (uint32_t)(jas_image_readcmptsample(jasImage, k, j ,i ));
97     }
98
99   jas_image_destroy(jasImage);
100   jas_image_clearfmts();
101
102   //FIXME
103   //delete the jpeg temp buffer
104   delete[] inputdata;
105
106   return true;
107 }
108
109 //-----------------------------------------------------------------------------
110 } // end namespace gdcm
111