Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程读取图像_C#_Multithreading_Image Processing_C# 3.0_Picasa - Fatal编程技术网

C# 多线程读取图像

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

我有一些C#代码,用于从磁盘读取图像,然后裁剪它们(可以选择调整大小),然后保存它们。但看起来只有30%的CPU在运行期间被使用,我可以使用多线程来提高速度还是磁盘读取速度是瓶颈? 如何正确加载cpu和磁盘以获得最高性能

    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。这需要做更多的工作,但您可以将循环中的代码块提取到单独的方法中,并使用线程库调用它。