This is HipsImage.c in view mode; [Download] [Up]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Mask.h"
#include "HipsImage.h"
int openImage(hipsImage *image)
{
int i,j,k;
int sz;
char *buf;
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->orig_name = (char *)malloc((strlen(buf)+1)*sizeof(char));
strcpy(image->orig_name,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->seq_name = (char *)malloc((strlen(buf)+1)*sizeof(char));
strcpy(image->seq_name,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->num_frame = atoi(buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->orig_date = (char *)malloc((strlen(buf)+1)*sizeof(char));
strcpy(image->orig_date,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->rows = atoi(buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->cols = atoi(buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->bits_per_pixel = atoi(buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->bit_packing = atoi(buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
image->pixel_format = atoi(buf);
image->seq_history = (char *)malloc(sizeof(char));
strcpy(image->seq_history,"\0");
image->seq_desc = (char *)malloc(sizeof(char));
strcpy(image->seq_desc,"\0");
if((buf = read_line(stdin,&sz)) == NULL) return 0;
while (sz > 1 && buf[sz-1] == '|' && buf[sz] == '\\' ) {
image->seq_history = (char *)realloc(image->seq_history,(strlen(image->seq_history)+sz+2)*sizeof(char));
image->seq_history = (char *)strcat(image->seq_history,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
}
if(sz > 1) {
image->seq_history = (char *)realloc(image->seq_history,(strlen(image->seq_history)+sz+2)*sizeof(char));
image->seq_history = (char *)strcat(image->seq_history,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
}
while ( strcmp( buf, "." ) ) {
image->seq_desc = (char *)realloc(image->seq_desc,(strlen(image->seq_desc)+sz+2)*sizeof(char));
image->seq_desc = (char *)strcat(image->seq_desc,buf);
if((buf = read_line(stdin,&sz)) == NULL) return 0;
}
if(strcmp(buf,"."))
return 0;
image->data = (int *)malloc(image->rows*image->cols*sizeof(int));
switch(image->pixel_format) {
case HIPS_PFBYTE:
if(image->bits_per_pixel != 8) return 0;
if(image->bit_packing != 0) return 0;
break;
default:
return 0;
}
k=0;
for(i=0;i<image->rows;i++) {
for(j=0;j<image->cols;j++) {
image->data[k] = fgetc(stdin);
k++;
}
}
return 1;
}
void writeHeader(hipsImage *image)
{
printf("%s\n",image->orig_name);
printf("%s\n",image->seq_name);
printf("%d\n",image->num_frame);
printf("%s\n",image->orig_date);
printf("%d\n",image->rows);
printf("%d\n",image->cols);
printf("%d\n",image->bits_per_pixel);
printf("%d\n",image->bit_packing);
printf("%d\n",image->pixel_format);
printf("%s\n",image->seq_history);
printf("%s\n",image->seq_desc);
printf(".\n");
}
int saveImage(hipsImage *image)
{
int i;
char fullPath[500];
writeHeader(image);
for(i=0;i<image->rows*image->cols;i++)
putchar(image->data[i]);
return 1;
}
hipsImage *copyImage(hipsImage *src)
{
hipsImage *new;
new = (hipsImage *)malloc(sizeof(hipsImage));
new->orig_name = getorig_name(src);
new->seq_name = getseq_name(src);
new->num_frame = getnum_frame(src);
new->orig_date = getorig_date(src);
new->rows = getrows(src);
new->cols = getcols(src);
new->bits_per_pixel = getbits_per_pixel(src);
new->bit_packing = getbit_packing(src);
new->pixel_format = getpixel_format(src);
new->seq_history = getseq_history(src);
new->seq_desc = getseq_desc(src);
new->data = getdata(src);
return new;
}
void convolveImage(hipsImage *image, mask *m)
{
int i,j,mx,my,dx,dy,r,c,k;
int mrows,mcols,msize;
float min,max;
float **cd,**d;
mrows = mcols = msize = m->size;
d = getfdata(image, &r,&c);
cd = (float **)malloc(r*c*sizeof(float *));
for(k=0;k<r;k++) cd[k] = (float *)malloc(c*sizeof(float));
max = -37267.0; min = 37267.0;
for(i=0;i<r;i++) {
for(j=0;j<c;j++) {
cd[i][j] = 0.0;
for(mx=0, dx=i-msize/2; mx<mrows; mx++, dx++) {
for(my=0, dy=j-msize/2; my<mcols; my++, dy++) {
if(dx >= 0 && dy >= 0 && dx < r && dy < c)
cd[i][j] += m->data[mx][my]*d[dx][dy];
}
}
if(cd[i][j] > max) max = cd[i][j];
if(cd[i][j] < min) min = cd[i][j];
}
}
k=0;
for(i=0;i<r;i++) {
for(j=0;j<c;j++) {
image->data[k] = (int)(255.0*(cd[i][j] - min)/(max - min));
k++;
}
}
}
void threshImage(hipsImage *image, int l, int h)
{
int i,j,k;
k=0;
for(i=0;i<image->rows;i++)
for(j=0;j<image->cols;j++) {
if(image->data[k] >= l && image->data[k] <= h)
image->data[k] = 255;
else
image->data[k] = 0;
k++;
}
}
void invertImage(hipsImage *image)
{
int i,j,k;
k=0;
for(i=0;i<image->rows;i++)
for(j=0;j<image->cols;j++) {
image->data[k] = 255 - image->data[k];
k++;
}
}
char *getorig_name(hipsImage *image)
{
char *on;
on = (char *)malloc((strlen(image->orig_name)+1)*sizeof(char));
strcpy(on,image->orig_name);
return(on);
}
char *getseq_name(hipsImage *image)
{
char *sn;
sn = (char *)malloc((strlen(image->seq_name)+1)*sizeof(char));
strcpy(sn,image->seq_name);
return(sn);
}
int getnum_frame(hipsImage *image)
{
return(image->num_frame);
}
char *getorig_date(hipsImage *image)
{
char *od;
od = (char *)malloc((strlen(image->orig_date)+1)*sizeof(char));
strcpy(od,image->orig_date);
return(od);
}
int getrows(hipsImage *image)
{
return(image->rows);
}
int getcols(hipsImage *image)
{
return(image->cols);
}
int getbits_per_pixel(hipsImage *image)
{
return(image->bits_per_pixel);
}
int getbit_packing(hipsImage *image)
{
return(image->bit_packing);
}
int getpixel_format(hipsImage *image)
{
return(image->pixel_format);
}
char *getseq_history(hipsImage *image)
{
char *sh;
sh = (char *)malloc((strlen(image->seq_history)+1)*sizeof(char));
strcpy(sh,image->seq_history);
return(sh);
}
char *getseq_desc(hipsImage *image)
{
char *sd;
sd = (char *)malloc((strlen(image->seq_desc)+1)*sizeof(char));
strcpy(sd,image->seq_desc);
return(sd);
}
int *getdata(hipsImage *image)
{
int *d;
int i,r,c;
r = image->rows; c = image->cols;
d = (int *)malloc(r*c*sizeof(int));
for(i=0;i<r*c;i++)
d[i] = image->data[i];
return(d);
}
float **getfdata(hipsImage *image, int *theRows, int *theCols)
{
int r,c,k;
int ival;
float **fdata;
r = *theRows = image->rows;
c = *theCols = image->cols;
fdata = (float **)malloc(r*sizeof(float *));
for(k=0;k<r;k++) fdata[k] = (float *)malloc(c*sizeof(float));
for(k=0;k<r*c;k++)
fdata[k/r][k%c] = (float)image->data[k];
return fdata;
}
char *read_line(FILE *fp,int *size)
{
int i=0, c;
char buf[5000];
c = fgetc(fp);
while( (c != '\n') && !feof(fp) && (i < 5000)) {
buf[i++] = c;
c = fgetc(fp);
}
if(!i) {
buf[0] = ' '; buf[1] = '\0';
}
else
buf[i] = '\0';
if(feof(fp))
return NULL;
*size = strlen(buf);
return(buf);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.