此代码用于从彩色转换为黑白。
但表现根本没有改善。
我通过在2 for循环和计数器值增量中更改除数值(代码中的800)来尝试800 * 600图像。
此更改应使线程数增加或减少
结果:
value | num of thread | time
800 1 1.17 sec
400 2 1.17 sec
200 4 1.17 sec
and so on ...
帮助我提高性能因为更大的图像需要8秒,我想让它平行
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace IMG
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string path = "";
public void openimage()
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = openFileDialog1.FileName;
}
}
Bitmap bm;
Bitmap gs;
private void button1_Click(object sender, EventArgs e)
{
if (path == "")
{
openimage();
}
Graphics g = this.CreateGraphics();
bm = new Bitmap(path);
// Draw image with no effects.....
g.DrawImage(bm, 100, 100, 200, 200);
gs = new Bitmap(bm.Width, bm.Height);
worker soso = new worker(gs, bm);
worker.counter = 0;
soso.tograyscale();
// Draw gray image.......
g.DrawImage(gs, 305, 100, 200, 200);
DateTime x = DateTime.Now;
for (int koko = 0; koko < gs.Width/400; koko++)
{
Thread t1 = new Thread(new ThreadStart(soso.trasform));
t1.Start();
t1.Join();
soso.increment();
}
g.DrawImage(bm, 510, 100, 200, 200);
gs.Dispose();
g.Dispose();
textBox19.Text=(DateTime.Now - x).ToString();
}
}
public class worker
{
public static int counter = 0;
public Bitmap gs;
public Bitmap bm;
public int xxxx;
public worker(Bitmap a, Bitmap b)
{
gs = a;
bm = b;
xxxx = a.Height;
}
public void increment()
{
counter += 400;
}
public void trasform()
{
argtransform(counter);
}
public void tograyscale()
{
for (int i = 0; i < bm.Width; i++)
{
for (int j = 0; j < bm.Height; j++)
{
Color c = bm.GetPixel(i, j);
int y = (int)(0.3 * c.R + 0.59 * c.G + 0.11 * c.B);
gs.SetPixel(i, j, Color.FromArgb(y, y, y));
}
}
}
public void argtransform(int cc)
{
for (int i = cc; i < cc + 400; i++)
{
for (int j = 0; j < xxxx; j++)
{
Color c = gs.GetPixel(i, j);
int y1 = 0;
if (c.R >= 128)
y1 = 255;
bm.SetPixel(i, j, Color.FromArgb(y1, y1, y1));
}
}
}
}
}
请尽快谢谢你
答案 0 :(得分:7)
在优化之前不要并行化。在优秀的分析器下运行代码并首先解决性能问题。是的,这可能最终成为并行化的一个很好的候选者,但我打赌,对SetPixel
的100万次调用是一个更大的问题。
答案 1 :(得分:4)
通过调用Thread.Start
然后立即调用Thread.Join
,您实际上是在串行而不是并行工作。在调用Thread.Start
的{{1}}循环后放置第二个循环。
Thread.Join
答案 2 :(得分:2)
GetPixel()/ SetPixel()是这样做的慢速方法。相反,你应该使用“不安全”的BitmapData和编辑图像的指针。
<强>更新强> 并且对BitmapData和灰度的快速谷歌搜索结果列出了这个example。
答案 3 :(得分:0)
在考虑并行化之前,您应该对代码进行分析,以找出实际花费的时间。
Eqatec's profiler是一款免费且易于使用的.NET分析工具。