【问题标题】:Can any one Help me out in Drawing a rectangle in an image? [closed]任何人都可以帮助我在图像中绘制矩形吗? [关闭]
【发布时间】:2013-06-29 10:51:23
【问题描述】:

伙计们,我是 C++ 的新程序员,请你帮我编写一个程序,在不使用 OpenCV 的情况下,在 Visual C++ 中以位图 24 位彩色图像绘制蓝色矩形。 同样在 VS C++ 中,我无法获得标题 graphics.h 而不是我使用的 shud。 我必须在图像中绘制一个矩形而不是线条 这是我在 VS-C++ 中的代码,它只在底部显示一条黑线:

void copy_Header(FILE *,FILE *);

void main()
{

    FILE *src; int offset; int width, height;
    fopen_s(&src,"jaguar.bmp","rb");
    FILE *dest;
    fopen_s(&dest,"rect_image.bmp","wb");

    fseek(src,10,SEEK_SET);
    fread(&offset,4,1,src);

    fseek(src,18,SEEK_SET);
    fread(&width,4,1,src);

    fseek(src,22,SEEK_SET);
    fread(&height,4,1,src);

    copy_Header(src,dest);

    fseek(src,offset,SEEK_SET);
    fseek(dest,offset,SEEK_SET);
    unsigned char x=(unsigned char)fgetc(src);
    double r,g,b,z[3];
    int i;
    unsigned char ch[3];
    b=ch[0]=fgetc(src);
    g=ch[1]=fgetc(src);
    r=ch[2]=fgetc(src);
    for (int j=0;j<4;j++)
    {
        for(; offset<width; offset++)
        {
            z[0]=b;
            z[1]=0;
            z[2]=0;
            fputc(z[0],dest);
            fputc(z[1],dest);
            fputc(z[2],dest);
        }
    }

    fseek(src,4096,SEEK_SET);
    fseek(dest,4096,SEEK_SET);
    unsigned char y= (unsigned char)fgetc(src);
    while(!feof(src))
    {
        fputc(y,dest);
        y=(unsigned char)fgetc(src);
    }
    fclose(src);
    fclose(dest);
    puts("Image Copied");
    _getch();

}

void copy_Header(FILE *srcImage,FILE *dstImage)
{
    unsigned char *ptrc= (unsigned char *)malloc(54*sizeof(char));

    fseek(srcImage,0,SEEK_SET);
    fseek(dstImage,0,SEEK_SET);

    fread(ptrc,54,1,srcImage);
    fwrite(ptrc,54,1,dstImage);
}

提前谢谢。 图像大小为 1024 x 1024,是 24 位图文件。

【问题讨论】:

  • 你展示的代码的哪一部分是试图绘制任何东西?
  • 先生,我已经编辑了我的帖子,并且在下面的代码中遇到了问题,在这里我尝试尝试一条线而不是矩形。但我也需要了解矩形。请帮帮我。
  • 先生,我不是软件工程师或 IT 专业人士。我对学习 VS-C++ 编程感到好奇。由于我是这个博客的新手,所以我对此一无所知。但是应该帮助一个新来的人不要降低他/她的道德。感谢您对 gr8 的支持。

标签: c++ visual-c++ bitmap


【解决方案1】:

让我们解决这个问题。

第一个问题:如何将像素坐标与其在文件中的位置联系起来?

换句话说,给定一个坐标为 (x,y) 的 RGB 像素,它在文件中的位置是什么?

让我们考虑它有 WIDTH 宽度和 HEIGHT 高度。由于它有 3 个通道 - 红色、绿色和蓝色 - 并且考虑到每个通道有 1 个字节,每个像素的大小将有 3 个字节。 BMP 文件只是一个像素矩阵,逐行组织,因此每行将有 3*WIDTH 字节。

x 坐标将告诉您将跳过多少行,y 将指向当前行中的像素。换句话说:

seek_position= x*(3*WIDTH) + 3*y

有了这个关系,你现在可以写一个类似的函数

int mat2seek(int x,int y){
    //converts a xy coordinate system to seek position
    return x*(3*WIDTH) + 3*y + BMP_HEADER_SIZE;
}

BMP_HEADER_SIZE 是自我解释的地方

第二个问题:既然你知道如何将(x,y)坐标系转换为seek系统,那么绘制矩形的算法是什么?

这种算法在 (x,y) 坐标中比寻找坐标容易得多:

for (int x = xini; x< xend; x++)
    for (int y=yini; y<yend; y++){
        int seek=mat2seek(x,y);
        //do the magic...
    }

【讨论】:

  • 你能告诉我我应该把这个功能代码放在哪里以及我如何在我的代码中应用它。先生,这将是 gr8 的帮助。
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多