40 short int svar, svars[2048];
41 char buf[4096], *cdata, *cptr;
42 int ivar, ivars[1024];
44 struct {
int n, r, g, b, dr, dg, db; }
45 bitty[] = { {32, 0, 0, 0, 2, 0, 4},
46 {32, 64, 0,128, -2, 0, 4},
47 {32, 0, 0,255, 0, 8, -8},
48 {64, 0,255, 0, 4, 0, 0},
49 {32, 255,255, 0, 0, -2, 0},
50 {64, 255,192, 0, 0, -3, 0} };
52 if(verbose>0) printf(
"tiffWriteImg(*img, %d, %d, %g, %d, %s, status, %d)\n",
53 plane, frame, *maxvalue, colorscale, fname, verbose);
56 if(status!=NULL) strcpy(status,
"fault in calling routine");
58 if(img->
dimt<(frame+1) || img->
dimz<(plane+1))
return(2);
59 int pxlNr=img->
dimx*img->
dimy;
if(pxlNr<1)
return(3);
60 if(status!=NULL) strcpy(status,
"ok");
65 for(
int pi=0; pi<img->
dimz; pi++)
if(plane<0 || plane==pi)
66 for(
int ri=0; ri<img->
dimy; ri++)
for(
int ci=0; ci<img->
dimx; ci++)
67 for(
int fi=0; fi<img->
dimt; fi++)
if(frame<0 || frame==fi)
68 if(img->
m[pi][ri][ci][fi]>*maxvalue)
69 *maxvalue=img->
m[pi][ri][ci][fi];
71 if(status!=NULL) strcpy(status,
"no positive pixel values");
79 if(plane<0) matNr=img->
dimz;
else matNr=1;
80 if(frame<0) matNr*=img->
dimt;
else matNr*=1;
81 if(verbose>1) printf(
"matNr=%d\n", matNr);
83 if(matXdim<=0 && matYdim<=0) {
84 matXdim=(int)ceil(sqrt((
double)matNr));
85 matYdim=matNr/matXdim;
if(matNr%matXdim) matYdim++;
88 matXdim=matNr; matYdim=1;
89 }
else if(matYdim>matNr) {
90 matYdim=matNr; matXdim=1;
91 }
else if(matXdim>0) {
92 matYdim=matNr/matXdim;
if(matNr%matXdim) matYdim++;
94 matXdim=matNr/matYdim;
if(matNr%matYdim) matXdim++;
97 if(verbose>1) printf(
"matXdim:=%d\nmatYdim:=%d\n", matXdim, matYdim);
101 if((fp=fopen(fname,
"wb")) == NULL) {
102 if(status!=NULL) strcpy(status,
"cannot open file for write");
107 memset(buf, 0, 4096);
109 if(
little_endian()) memcpy(buf,
"II", 2);
else memcpy(buf,
"MM", 2);
111 svar=42; memcpy(buf+2, &svar, 2);
113 ivar=8; memcpy(buf+4, &ivar, 4);
117 svar=12;
else svar=11;
118 memcpy(buf+8, &svar, 2);
122 svars[0]=256; svars[1]=4; memcpy(cptr, svars, 4); cptr+=4;
123 ivars[0]=1; ivars[1]=matXdim*img->
dimx; memcpy(cptr, ivars, 8); cptr+=8;
125 svars[0]=257; svars[1]=4; memcpy(cptr, svars, 4); cptr+=4;
126 ivars[0]=1; ivars[1]=matYdim*img->
dimy; memcpy(cptr, ivars, 8); cptr+=8;
128 svars[0]=258; svars[1]=3; memcpy(cptr, svars, 4); cptr+=4;
129 ivars[0]=1; memcpy(cptr, ivars, 4); cptr+=4;
130 svars[0]=(
unsigned short int)8; memcpy(cptr, svars, 2); cptr+=4;
132 svars[0]=259; svars[1]=3; memcpy(cptr, svars, 4); cptr+=4;
133 ivars[0]=1; memcpy(cptr, ivars, 4); cptr+=4;
134 svars[0]=1; memcpy(cptr, svars, 2); cptr+=4;
136 svars[0]=262; svars[1]=3; memcpy(cptr, svars, 4); cptr+=4;
137 ivars[0]=1; memcpy(cptr, ivars, 4); cptr+=4;
144 memcpy(cptr, svars, 2); cptr+=4;
146 svars[0]=273; svars[1]=4; memcpy(cptr, svars, 4); cptr+=4;
148 ivars[0]=1; ivars[1]=4096; memcpy(cptr, ivars, 8); cptr+=8;
150 svars[0]=278; svars[1]=4; memcpy(cptr, svars, 4); cptr+=4;
151 ivars[0]=1; ivars[1]=matYdim*img->
dimy; memcpy(cptr, ivars, 8); cptr+=8;
153 svars[0]=279; svars[1]=4; memcpy(cptr, svars, 4); cptr+=4;
154 ivars[0]=1; ivars[1]=matXdim*matYdim*pxlNr; memcpy(cptr, ivars, 8); cptr+=8;
156 ivars[0]=33; ivars[1]=1; ivars[2]=33; ivars[3]=1; memcpy(buf+1024, ivars, 16);
157 svars[0]=282; svars[1]=5; memcpy(cptr, svars, 4); cptr+=4;
158 ivars[0]=1; ivars[1]=1024; memcpy(cptr, ivars, 8); cptr+=8;
160 svars[0]=283; svars[1]=5; memcpy(cptr, svars, 4); cptr+=4;
161 ivars[0]=1; ivars[1]=1032; memcpy(cptr, ivars, 8); cptr+=8;
163 svars[0]=296; svars[1]=3; memcpy(cptr, svars, 4); cptr+=4;
164 ivars[0]=1; memcpy(cptr, ivars, 4); cptr+=4;
165 svars[0]=3; memcpy(cptr, svars, 2); cptr+=4;
168 for(
int i=0; i<4; i++) *cptr++=(
char)0;
172 svars[0]=320; svars[1]=3; memcpy(cptr, svars, 4); cptr+=4;
173 ivars[0]=3*256; memcpy(cptr, ivars, 4); cptr+=4;
175 ivars[0]=2048; memcpy(cptr, ivars, 4); cptr+=4;
177 for(i=0; i<4; i++) *cptr++=(
char)0;
181 for(i=0, j=0; j<6; j++) {
182 svars[i++]=bitty[j].r;
183 for(
int k=1; k<bitty[j].n; k++, i++) svars[i]=svars[i-1]+bitty[j].dr;
186 memcpy(cptr, svars, 512); cptr+=512;
188 for(i=0, j=0; j<6; j++) {
189 svars[i++]=bitty[j].g;
190 for(
int k=1; k<bitty[j].n; k++, i++) svars[i]=svars[i-1]+bitty[j].dg;
193 memcpy(cptr, svars, 512); cptr+=512;
195 for(i=0, j=0; j<6; j++) {
196 svars[i++]=bitty[j].b;
197 for(
int k=1; k<bitty[j].n; k++, i++) svars[i]=svars[i-1]+bitty[j].db;
200 memcpy(cptr, svars, 512); cptr+=512;
204 if(fwrite(buf, 1, 4096, fp) != 4096) {
205 fclose(fp); remove(fname);
206 if(status!=NULL) strcpy(status,
"cannot write file");
211 cdata=(
char*)calloc(matXdim*matYdim*pxlNr,
sizeof(
char));
213 fclose(fp); remove(fname);
214 if(status!=NULL) strcpy(status,
"out of memory");
218 int mi=0;
int mc=0;
int mr=1;
219 for(
int fi=0; fi<img->
dimt; fi++)
if(frame<0 || frame==fi) {
220 for(
int pi=0; pi<img->
dimz; pi++)
if(plane<0 || plane==pi) {
222 for(
int ri=0; ri<img->
dimy; ri++)
223 for(
int ci=0; ci<img->
dimx; ci++) {
224 cptr=cdata + (mr-1)*matXdim*pxlNr + ri*matXdim*img->
dimx + (mc-1)*img->
dimx + ci;
225 if(img->
m[pi][ri][ci][fi]>0.0) {
226 if((img->
m[pi][ri][ci][fi])<(*maxvalue))
227 *cptr=(
unsigned char)(255.*(img->
m[pi][ri][ci][fi])/(*maxvalue));
228 else *cptr=(
unsigned char)255;
230 *cptr=(
unsigned char)0;
232 if(mc==matXdim) {mc=0; mr++;}
236 if(fwrite(cptr, 1, matXdim*matYdim*pxlNr, fp) != (
unsigned int)matXdim*matYdim*pxlNr) {
237 fclose(fp); remove(fname); free(cdata);
238 if(status!=NULL) strcpy(status,
"cannot write file");
244 if(status!=NULL) strcpy(status,
"ok");