博客已转移至个人网站(http://www.p-chao.com)
原型说明:
包含头文件:
#define WHITE 255
#define BLACK 0
#define PI 3.1415926535897932384626433
#include<stdio.h>
#include<malloc.h>
#include<math.h>
int imrotate(unsigned char *imagein,unsigned char *imagert,float angle,int sizein[2],int size[2],int inter);
int imzoom(unsigned char *imagein, unsigned char *imageout,int sizein[2],int size[2],int inter);
int imboundaryblack(unsigned char *imagein,int radius,int size[2],int mood);
int imthresh(unsigned char *image,int thresh,int size[2]);
源码:
#include"imtr.h"
int imrotate(unsigned char *imagein,unsigned char *imagert,float angle,int sizein[2],int size[2],int inter)
{
/*
size[0] = (int)( sizein[1] * fabs(sin(angler)) + sizein[0] * fabs(cos(angler)) );
size[1] = (int)( sizein[1] * fabs(cos(angler)) + sizein[0] * fabs(sin(angler)) );
*/
int i,j;
int x,y;
int iu,iv;
float u,v;
float r,s;
int coordmod[2];
if(angle > 0)
{
x = (int)(angle/(2*PI));
angle = angle - x * 2 * PI;
}
if(angle < 0)
{
x = (int)((-angle)/(2*PI));
angle = angle - x * 2 * PI;
}
if(angle >= 0 && angle < PI/2)
{
coordmod[0] = (int)( sizein[1] * sin(angle) );
coordmod[1] = 0;
}
if(angle < 0 && angle > -PI/2)
{
coordmod[0] = 0;
coordmod[1] = (int)( sizein[0] * sin(-angle) );
}
if(angle >=PI/2 && angle < PI)
{
coordmod[0] = (int)( sizein[0] * sin(angle - PI/2) + sizein[1] * cos(angle - PI/2) );
coordmod[1] = (int)( sizein[1] * sin(angle - PI/2) );
}
if(angle >= -PI && angle <= -PI/2)
{
coordmod[0] = (int)( sizein[0] * sin(-angle - PI/2) );
coordmod[1] = (int)( sizein[0] * cos(-angle - PI/2) + sizein[1] * sin(-angle - PI/2) );
}
if(inter == 1)
{
for(i = 0; i < size[1]; i++)
{
y = i - coordmod[1];
for(j = 0; j < size[0]; j++)
{
x = j - coordmod[0];
u = (float)( x * cos(angle) + y * sin(angle) );
v = (float)( y * cos(angle) - x * sin(angle) );
if( u < 1 || u >= (sizein[0]-2) || v < 1 || v >= (sizein[1]-2) )
{
*(imagert+i*size[0]+j) = BLACK;
}
else
{
r = u - (int)u;
s = v - (int)v;
*(imagert+i*size[0]+j) = (int)( (1-r) * (1-s) * (*(imagein + (int)v * sizein[0] + (int)u) ) + (1-r) * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u) )
+ (1-s) * r * (*(imagein + (int)v * sizein[0] + (int)u + 1) ) + r * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u + 1) ) );
}
}
}
}
if(inter == 0)
{
for(i = 0; i < size[1]; i++)
{
y = i - coordmod[1];
for(j = 0; j < size[0]; j++)
{
x = j - coordmod[0];
iu = (int)( x * cos(angle) + y * sin(angle) );
iv = (int)( y * cos(angle) - x * sin(angle) );
if(iu < 1 || iu >= (sizein[0]-2) || iv < 1 || iv >= (sizein[1]-2) )
{
*(imagert+i*size[0]+j) = BLACK;
}
else
{
*(imagert+i*size[0]+j) = *(imagein + iv * sizein[0] + iu);
}
}
}
}
return 0;
}
int imzoom(unsigned char *imagein, unsigned char *imageout,int sizein[2],int size[2],int inter)
{
int i,j;
float scale[2];
float u,v,r,s;
int iu,iv;
scale[0] = (float)sizein[0]/size[0];
scale[1] = (float)sizein[1]/size[1];
if(inter == 1)
{
for(i = 0; i < size[1]; i++)
{
for(j = 0; j < size[0]; j++)
{
u = (float)( j * scale[0] );
v = (float)( i * scale[1] );
if( u < 1 || u >= (sizein[0]-2) || v < 1 || v >= (sizein[1]-2) )
{
*(imageout+i*size[0]+j) = BLACK;
}
else
{
r = u - (int)u;
s = v - (int)v;
*(imageout+i*size[0]+j) = (int)( (1-r) * (1-s) * (*(imagein + (int)v * sizein[0] + (int)u) ) + (1-r) * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u) )
+ (1-s) * r * (*(imagein + (int)v * sizein[0] + (int)u + 1) ) + r * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u + 1) ) );
}
}
}
}
if(inter == 0)
{
for(i = 0; i < size[1]; i++)
{
for(j = 0; j < size[0]; j++)
{
iu = (int)( j * scale[0] );
iv = (int)( i * scale[1] );
if(iu < 1 || iu >= (sizein[0]-2) || iv < 1 || iv >= (sizein[1]-2) )
{
*(imageout+i*size[0]+j) = BLACK;
}
else
{
*(imageout+i*size[0]+j) = *(imagein + iv * sizein[0] + iu);
}
}
}
}
return 0;
}
int imboundaryblack(unsigned char *imagein,int radius,int size[2],int mood)
{
int i,j;
int bac,b;
int **boundary = (int **)calloc(2*size[1],sizeof(int));
for( i = 0; i < size[1]; i++ )
{
boundary[i] = (int *)calloc(2,sizeof(int));
}
if(mood == 0)
{
for( i = 0; i < size[1]; i++)
{
bac = fabs((float)i - size[1]/2);
if( bac >= radius)
{
boundary[i][0] = size[0];
boundary[i][1] = -1;
}
else
{
b = sqrt( (float)radius * radius - bac *bac );
boundary[i][0] = size[0]/2 - b;
boundary[i][1] = size[0]/2 + b;
}
}
}
if(mood == 1)
{
for( i = 0; i < size[1]; i++)
{
if(i < radius || i > size[1] - radius - 1)
{
boundary[i][0] = size[0];
boundary[i][1] = -1;
}
else
{
boundary[i][0] = radius;
boundary[i][1] = size[0] - radius -1;
}
}
}
for(i = 0; i < size[1]; i++)
{
for(j = 0; j < size[0]; j++)
{
if( j < boundary[i][0] || j > boundary[i][1] )
*(imagein + i * size[0] + j) = BLACK;
}
}
for(i = 0; i < size[1]; i++)
{
free(boundary[i]);
}
free(boundary);
return 0;
}
int imthresh(unsigned char *image,int thresh,int size[2])
{
int i;
for(i = 0; i < size[0]*size[1]; i++)
{
if(*(image + i) > thresh)
*(image + i) = WHITE;
else
*(image + i) = BLACK;
}
return 0;
}