C# 多线程读取图像
我有一些C#代码,用于从磁盘读取图像,然后裁剪它们(可以选择调整大小),然后保存它们。但看起来只有30%的CPU在运行期间被使用,我可以使用多线程来提高速度还是磁盘读取速度是瓶颈? 如何正确加载cpu和磁盘以获得最高性能C# 多线程读取图像,c#,multithreading,image-processing,c#-3.0,picasa,C#,Multithreading,Image Processing,C# 3.0,Picasa,我有一些C#代码,用于从磁盘读取图像,然后裁剪它们(可以选择调整大小),然后保存它们。但看起来只有30%的CPU在运行期间被使用,我可以使用多线程来提高速度还是磁盘读取速度是瓶颈? 如何正确加载cpu和磁盘以获得最高性能 string path = args[0]; int counter = 0; foreach (string dir in Directory.GetDirectories(path)) { Console.WriteLine
string path = args[0];
int counter = 0;
foreach (string dir in Directory.GetDirectories(path))
{
Console.WriteLine("processing: " + dir);
//create folder for faces
string dir_path = dir + "\\face";
System.IO.Directory.CreateDirectory(dir_path);
try
{
string ini_path = dir + "\\.picasa.ini";
if (File.Exists(ini_path))
{
FileIniDataParser parser = new FileIniDataParser();
IniData data = parser.LoadFile(ini_path);
foreach (SectionData section in data.Sections)
{
if (section.SectionName.Contains(".jpg"))
{
string rects = data[section.SectionName]["faces"];
string[] str_rects = GetRectStrings(rects);
for (int i = 0; i < str_rects.Length; ++i)
{
Bitmap img = (Bitmap)Image.FromFile(dir + "\\" + section.SectionName, true);
RectangleF rectF = GetRectangle(str_rects[i]);
int im_w = img.Width;
int im_h = img.Height;
rectF.X = rectF.X * im_w;
rectF.Y = rectF.Y * im_h;
rectF.Width = rectF.Width * im_w;
rectF.Height = rectF.Height * im_h;
Bitmap bmpCrop = img.Clone(rectF, img.PixelFormat);
string text_path = Directory.GetParent(path).FullName + "\\db.txt";
string crop_path = dir + "\\face\\" +
Path.GetFileNameWithoutExtension(dir + "\\" + section.SectionName) + "_" + i.ToString() + "_crop.png";
bool resize = true;
if (resize)
{
Bitmap resized = new Bitmap(bmpCrop, new Size(24, 32));//вынести в параметры
resized.Save(crop_path,
System.Drawing.Imaging.ImageFormat.Png);
Bitmap gr = ConvertGray(resized);
AppendToTxtFile(gr, text_path);
}
else
{
bmpCrop.Save(crop_path,
System.Drawing.Imaging.ImageFormat.Png);
Bitmap gr = ConvertGray(bmpCrop);
AppendToTxtFile(gr, text_path);
}
counter++;
}
}
}
}
}
catch
{
Console.WriteLine("problem in: " + dir);
}
Console.WriteLine("rects: " + counter.ToString());
}
Console.WriteLine("all done");
Console.ReadLine();
string path=args[0];
int计数器=0;
foreach(Directory.GetDirectories(path)中的字符串dir)
{
控制台写入线(“处理:+dir”);
//为面创建文件夹
字符串dir\u path=dir+“\\face”;
System.IO.Directory.CreateDirectory(dir\u路径);
尝试
{
字符串ini\u path=dir+“\\.picasa.ini”;
if(File.Exists(ini_路径))
{
FileIniDataParser parser=新的FileIniDataParser();
IniData=parser.LoadFile(ini\u路径);
foreach(数据节中的节数据节)
{
if(section.SectionName.Contains(“.jpg”))
{
string rects=data[section.SectionName][“faces”];
string[]str_rects=GetRectStrings(rects);
对于(int i=0;i
您具有从磁盘读取的两个要素,这可能需要花费一些时间,具体取决于您的磁盘质量,但您仍然受到IO工作和调整映像大小的CPU限制
如果您绑定到.NET 3.5,我建议您使用FileStreams.BeginRead(使用较旧的异步模式)异步加载图像,然后启动后台工作程序来调整图像大小以最大限度地提高CPU使用率。查看Parallel.ForEach而不是ForEach语句。这应该允许多线程并行执行该代码块。@Grax,但我仅限于.net 3.5。这需要做更多的工作,但您可以将循环中的代码块提取到单独的方法中,并使用线程库调用它。