简单的对图片处理2个小问题

wdgphc 2016-05-20 01:27:18
N久不编程了,好像什么都不会了,特来求段代码

2个问题,每个问题都精简了一下
(1)
如图所示,我要按照输入的像素值,画出一个正方形,并且在正方形中内接一个圆,然后将四个角填充。
要求一下每个填充角中黑色像素的个数。要求按照每一行统计。
代码中都可以不显示界面中画方,画圆,填充等操作,只需要最后像素个数的值即可。

(2)c#中用pictureBox 控件,读入一张jpg图片并显示,通过按钮可以实现画线等简单操作(线的长度和位置可以在代码中写死就行),然后可以将修改后的图片保存即可。

求求求,代码能调通就行。
...全文
754 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
引用 17 楼 xuzuning 的回复:
不能重合是计算精度造成的,你可以启用抗锯齿功能来弥补 不知道你实际在想做什么(好像不是科学研究),倒个角其实用路径是最方便的
自己做个小东西,这个只是抽象出来的一点,有了思路,扩展到其他程序中去。谢谢
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
通过遍历取点法得到的结果能够完整填充,不知道是什么原理。先结贴,多谢各位。
xuzuning 2016-05-20
  • 打赏
  • 举报
回复
不能重合是计算精度造成的,你可以启用抗锯齿功能来弥补 不知道你实际在想做什么(好像不是科学研究),倒个角其实用路径是最方便的
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
感谢以上朋友回帖。


用x^2 + y^2 > R^2 的原理应该是对的。但是我用计算出来结果按像素去填充却发现和画出来的弧不能完成重合。
我再用以上朋友通过获取色素的方式试试。
assky124 2016-05-20
  • 打赏
  • 举报
回复
像素点是非连续空间,不是数学中空间,1,2中间没其他值了 不对称很正常啊。 你的正方形宽度是奇数,应该能对称吧
  • 打赏
  • 举报
回复
Bitmap image = new Bitmap(101, 101);
var graph = Graphics.FromImage(image);
graph.Clear(Color.Black);
Brush brush = new SolidBrush(Color.Red);
Pen pen = new Pen(brush,1);
graph.DrawEllipse(pen, 0, 0, 100, 100);
var compareColor = Color.FromArgb(255, Color.Black);
for (var i = 0; i < 50; i++)
{
    int num = 0;
    for (var j = 0; j < 50; j++)
    {
        var color = image.GetPixel(i, j);
        if (color == compareColor)
        {
            num += 2;
        }
        else
        {
            break;
        }
    }
    Console.WriteLine("第{0}和{1}行有{2}个点", i, 101 - i, num);
}
xuzuning 2016-05-20
  • 打赏
  • 举报
回复
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
其实就是 :正方形面积 - 圆的面积 如果点(x,y) 在圆内,那么必然满足 x * x + y * y <= 半径的平方(相等就是在圆周上)
原理我想明白了,但是结果为什么不对称呢?
拜一刀 2016-05-20
  • 打赏
  • 举报
回复

正方形边长2r个像素,第L行时,像素数应该是r-(根号下(r方-(r-L)方))?
xuzuning 2016-05-20
  • 打赏
  • 举报
回复
其实就是 :正方形面积 - 圆的面积 如果点(x,y) 在圆内,那么必然满足 x * x + y * y <= 半径的平方(相等就是在圆周上)
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
我7楼说的半径应为30.无法编辑
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
每一行,我二楼的不是有做法么…… 通过计算方式我就搞不定了,数学还给高中、初中老师N年了
的确是这样,我需要个代码,我写了个,用graphics类可以画图但无法get像素颜色,用bitmap类可以取色但无法画图,两者结合不成功
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
1、 设输入的正方形边长为 2 * radius 则: var R2 = radius * radius; var num = 0; for(int x = 0; x < radius; x++) { for(int y = 0; y < radius; y++) { if(x * x + y * y > R2) num++; } } num * 4 即为所求答案 2、 var p = new PictureBox(); p.Load(“图片文件名"); var g = Graphics.FromImage(p.Image); g.DrawLine(Pen.Red, 0, 0, p.Width, p.Height); p.Image.Save("目标图片名");
第一题好像不太对,但我一直没想清楚。比如半径为3,第一个填充中第1-30行中黑色素的数量分布为 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 4 4 5 5 6 7 8 9 10 11 13 15 16 19 22 看起来不太对,应该是个对称的,前几个是0,后几个就应该是30
  • 打赏
  • 举报
回复
每一行,我二楼的不是有做法么…… 通过计算方式我就搞不定了,数学还给高中、初中老师N年了
wdgphc 2016-05-20
  • 打赏
  • 举报
回复
以上3位,我是第一题是要求每一行中有多少个黑色像素,不光是黑像素的总数
crystal_lz 2016-05-20
  • 打赏
  • 举报
回复
第一题 直接就可以计算出来吧 反正你是内切圆 又是正方形 如果以像素为单位 (正方形面积 - 圆的面积) / 4 就是像素个数了 第二个问题 参照一楼
  • 打赏
  • 举报
回复
如果问题1只是求个数的话,那不就是squart*squart - Math.PI*(squart/2)*(squart/2)么?
  • 打赏
  • 举报
回复
不就是创建图片,用黑色刷笔画正方形,再用白色刷笔画圆 最后就是按像素位一行行遍历取色,一行中取到的每个黑色就是你要的
xuzuning 2016-05-20
  • 打赏
  • 举报
回复
1、 设输入的正方形边长为 2 * radius 则: var R2 = radius * radius; var num = 0; for(int x = 0; x < radius; x++) { for(int y = 0; y < radius; y++) { if(x * x + y * y > R2) num++; } } num * 4 即为所求答案 2、 var p = new PictureBox(); p.Load(“图片文件名"); var g = Graphics.FromImage(p.Image); g.DrawLine(Pen.Red, 0, 0, p.Width, p.Height); p.Image.Save("目标图片名");

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧