summaryrefslogtreecommitdiff
path: root/codec/convert.c
diff options
context:
space:
mode:
authorParvatha Elangovan <p.elangovan@intopix.com>2007-04-10 16:23:48 +0000
committerParvatha Elangovan <p.elangovan@intopix.com>2007-04-10 16:23:48 +0000
commitdbd132dca8f87a75c5d5addb1e6324da7c089c09 (patch)
treecae685a5ba2f7ac9fc6273543e7a3ca4f3bbd614 /codec/convert.c
parent0930d9886b52a4d4f46162cc0c7c292cfd393ebd (diff)
Accepting "j2c" as format for Encoding and Decoding. Modification in image_to_j2k.c.
Modified imagetotif() to read images with signed data. Modification in convert.c.
Diffstat (limited to 'codec/convert.c')
-rw-r--r--codec/convert.c134
1 files changed, 93 insertions, 41 deletions
diff --git a/codec/convert.c b/codec/convert.c
index 999b41ca..4ffa1ef0 100644
--- a/codec/convert.c
+++ b/codec/convert.c
@@ -1082,7 +1082,7 @@ typedef struct tiff_infoheader{
}tiff_infoheader_t;
int imagetotif(opj_image_t * image, const char *outfile) {
- int width, height;
+ int width, height, imgsize;
int bps,index;
TIFF *tif;
tdata_t buf;
@@ -1107,7 +1107,8 @@ int imagetotif(opj_image_t * image, const char *outfile) {
}
width = image->comps[0].w;
- height= image->comps[0].h;
+ height = image->comps[0].h;
+ imgsize = image->comps[0].w * image->comps[0].h ;
bps = image->comps[0].prec;
/* Set tags */
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
@@ -1129,34 +1130,74 @@ int imagetotif(opj_image_t * image, const char *outfile) {
int i;
dat8 = buf;
if (image->comps[0].prec == 8){
- for (i=0; i<TIFFStripSize(tif); i+=3) { // 8 bits per pixel
- dat8[i+0] = image->comps[0].data[index] ; // R
- dat8[i+1] = image->comps[1].data[index] ; // G
- dat8[i+2] = image->comps[2].data[index] ; // B
- index++;
+ for (i=0; i < strip_size; i+=3) { // 8 bits per pixel
+ int r = 0,g = 0,b = 0;
+ if(index < imgsize){
+ r = image->comps[0].data[index];
+ r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ g = image->comps[1].data[index];
+ g += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ b = image->comps[2].data[index];
+ b += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+
+ dat8[i+0] = r ; // R
+ dat8[i+1] = g ; // G
+ dat8[i+2] = b ; // B
+ index++;
+ }else
+ break;
}
}else if (image->comps[0].prec == 12){
- for (i=0; i<TIFFStripSize(tif); i+=9) { // 12 bits per pixel
- dat8[i+0] = (image->comps[0].data[index]>>8)<<4 | (image->comps[0].data[index]>>4);
- dat8[i+1] = (image->comps[0].data[index]<<4)|((image->comps[1].data[index]>>8)& 0x0f);
- dat8[i+2] = (image->comps[1].data[index]);
- dat8[i+3] = (image->comps[2].data[index]>>8)<<4 | (image->comps[2].data[index]>>4);
- dat8[i+4] = (image->comps[2].data[index]<<4)|((image->comps[1].data[index+1]>>8)& 0x0f);
- dat8[i+5] = (image->comps[0].data[index+1]);
- dat8[i+6] = (image->comps[1].data[index+1]>>8)<<4 | (image->comps[1].data[index+1]>>4);
- dat8[i+7] = (image->comps[1].data[index+1]<<4)|((image->comps[2].data[index+1]>>8)& 0x0f);
- dat8[i+8] = (image->comps[2].data[index+1]);
- index+=2;
+ for (i=0; i<strip_size; i+=9) { // 12 bits per pixel
+ int r = 0,g = 0,b = 0;
+ int r1 = 0,g1 = 0,b1 = 0;
+ if(index < imgsize){
+ r = image->comps[0].data[index];
+ r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ g = image->comps[1].data[index];
+ g += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ b = image->comps[2].data[index];
+ b += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ r1 = image->comps[0].data[index+1];
+ r1 += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ g1 = image->comps[1].data[index+1];
+ g1 += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ b1 = image->comps[2].data[index+1];
+ b1 += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+
+ dat8[i+0] = (r >> 4);
+ dat8[i+1] = ((r & 0x0f) << 4 )|((g >> 8)& 0x0f);
+ dat8[i+2] = g ;
+ dat8[i+3] = (b >> 4);
+ dat8[i+4] = ((b & 0x0f) << 4 )|((r1 >> 8)& 0x0f);
+ dat8[i+5] = (r1);
+ dat8[i+6] = (g1 >> 4);
+ dat8[i+7] = ((g1 & 0x0f)<< 4 )|((b1 >> 8)& 0x0f);
+ dat8[i+8] = (b1);
+ index+=2;
+ }else
+ break;
}
}else if (image->comps[0].prec == 16){
- for (i=0; i<TIFFStripSize(tif); i+=6) { // 16 bits per pixel
- dat8[i+0] = image->comps[0].data[index];//LSB
- dat8[i+1] = (image->comps[0].data[index]>> 8);//MSB
- dat8[i+2] = image->comps[1].data[index];
- dat8[i+3] = (image->comps[1].data[index]>> 8);
- dat8[i+4] = image->comps[2].data[index];
- dat8[i+5] = (image->comps[2].data[index]>> 8);
- index++;
+ for (i=0; i<strip_size; i+=6) { // 16 bits per pixel
+ int r = 0,g = 0,b = 0;
+ if(index < imgsize){
+ r = image->comps[0].data[index];
+ r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ g = image->comps[1].data[index];
+ g += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+ b = image->comps[2].data[index];
+ b += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+
+ dat8[i+0] = r;//LSB
+ dat8[i+1] = (r >> 8);//MSB
+ dat8[i+2] = g;
+ dat8[i+3] = (g >> 8);
+ dat8[i+4] = b;
+ dat8[i+5] = (b >> 8);
+ index++;
+ }else
+ break;
}
}else{
fprintf(stderr,"Bits=%d, Only 8,12,16 bits implemented\n",image->comps[0].prec);
@@ -1249,6 +1290,7 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
OPJ_COLOR_SPACE color_space;
opj_image_cmptparm_t cmptparm[3];
opj_image_t * image = NULL;
+ int imgsize;
tif = TIFFOpen(filename, "r");
@@ -1303,6 +1345,7 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
strip_size=0;
strip_size=TIFFStripSize(tif);
index = 0;
+ imgsize = image->comps[0].w * image->comps[0].h ;
/* Read the Image components*/
for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++) {
unsigned char *dat8;
@@ -1312,29 +1355,38 @@ opj_image_t* tiftoimage(char *filename, opj_cparameters_t *parameters)
if (Info.tiBps==12){
for (i=0; i<ssize; i+=9) { /*12 bits per pixel*/
- image->comps[0].data[index] = ( dat8[i+0]<<4 ) |(dat8[i+1]>>4);
- image->comps[1].data[index] = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2];
- image->comps[2].data[index] = ( dat8[i+3]<<4) |(dat8[i+4]>>4);
- image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5];
- image->comps[1].data[index+1] = ( dat8[i+6] <<4) |(dat8[i+7]>>4);
- image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8];
- index+=2;
+ if(index < datasize){
+ image->comps[0].data[index] = ( dat8[i+0]<<4 ) |(dat8[i+1]>>4);
+ image->comps[1].data[index] = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2];
+ image->comps[2].data[index] = ( dat8[i+3]<<4) |(dat8[i+4]>>4);
+ image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5];
+ image->comps[1].data[index+1] = ( dat8[i+6] <<4) |(dat8[i+7]>>4);
+ image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8];
+ index+=2;
+ }else
+ break;
}
}
else if( Info.tiBps==16){
for (i=0; i<ssize; i+=6) { /* 16 bits per pixel */
- image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; // R
- image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; // G
- image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; // B
- index++;
+ if(index < datasize){
+ image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; // R
+ image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; // G
+ image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; // B
+ index++;
+ }else
+ break;
}
}
else if ( Info.tiBps==8){
for (i=0; i<ssize; i+=3) { /* 8 bits per pixel */
- image->comps[0].data[index] = dat8[i+0]; // R
- image->comps[1].data[index] = dat8[i+1]; // G
- image->comps[2].data[index] = dat8[i+2]; // B
- index++;
+ if(index < datasize){
+ image->comps[0].data[index] = dat8[i+0]; // R
+ image->comps[1].data[index] = dat8[i+1]; // G
+ image->comps[2].data[index] = dat8[i+2]; // B
+ index++;
+ }else
+ break;
}
}
else{