ftp.nice.ch/pub/next/graphics/bitmap/dips.1.00.s.tar.gz#/DIPS/_dips/HipsImage.c

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.