在图像上画线(给出任意两个点)c代码实现

来源:互联网 发布:釉中彩餐具安全吗 知乎 编辑:程序博客网 时间:2024/05/29 07:37
//防止图像出界的函数int clamp_s(int value, int m_min, int m_max){    int mm_ret = value;    if(value < m_min)    {        mm_ret = m_min;    }else if(value > m_max)    {        mm_ret = m_max;    }    return mm_ret;}// data 图像数据// width图像宽度// height图像高度// channel图像通道// x0 第一个坐标x// y0 第一个坐标y// x1 第2个坐标x// y1 第2个坐标y// shinner 线条宽度// red 红色通道值// gree红色通道值// blue红色通道值int LiDrewLine_Source(unsigned char * data, int width, int height, int channel, int x0, int y0, int x1, int y1, int shinner, unsigned char red, unsigned char gree, unsigned char blue){    float a = 0;    float b = 0;    int i = 0;    int j = 0;    int k = 0;    int m = 0;    unsigned char color[4] = {red, gree, blue, 0};    int minx = 0;    int maxx = 0;    int miny = 0;    int maxy = 0;    float yy = 0.0f;    float xx = 0.0f;    if(x0 > x1)    {        maxx = x0;        minx = x1;    }else    {        maxx = x1;        minx = x0;    }    if(y0 > y1)    {        maxy = y0;        miny = y1;    }else    {        maxy = y1;        miny = y0;    }    if(maxy - miny > maxx - minx)    {        a = (x1 - x0) * 1.0f / (y1 - y0);        b = x0 * 1.0f - a * y0;        for(i = miny; i <= maxy; i ++)        {            xx = a * i + b;            m = (int)xx;            for(j = m - shinner; j <= m + shinner; j ++)            {                for(k = 0; k < channel; k ++)                {                    data[(clamp_s(i, 0, height - 1) * width + clamp_s(j, 0, width - 1)) * channel + k] = color[k];                }            }        }    }else    {        a = (y1 - y0) * 1.0f / (x1 - x0);        b = y0 * 1.0f - a * x0;        for(i = minx; i <= maxx; i ++)        {            yy = a * i + b;            m = (int)yy;            for(j = m - shinner; j <= m + shinner; j ++)            {                for(k = 0; k < channel; k ++)                {                    data[(clamp_s(j, 0, height - 1) * width + clamp_s(i, 0, width - 1)) * channel + k] = color[k];                }            }        }    }    return 0;}
0 0