我正在编写一个代码来调整C#中的JPG图像大小.我的代码需要大约6秒来调整20张JPG图像的大小.我想知道在C#中有没有更快的方法呢?任何改善这一点的建议都表示赞赏!
这是我现在的代码:
Bitmap bmpOrig, bmpDest, bmpOrigCopy;
foreach (string strJPGImagePath in strarrFileList)
{
bmpOrig = new Bitmap(strJPGImagePath);
bmpOrigCopy = new Bitmap(bmpOrig);
bmpOrig.Dispose();
File.Delete(strJPGImagePath);
bmpDest = new Bitmap(bmpOrigCopy, new Size(100, 200));
bmpDest.Save(strJPGImagePath, jgpEncoder, myEncoderParameters);
bmpOrigCopy.Dispose();
bmpDest.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
感谢@Guffa的解决方案.我将dispose()移出了foreach循环.更新和快速的代码是:
Bitmap bmpDest = new Bitmap(1, 1);
foreach (string strJPGImagePath in strarrFileList)
{
using (Bitmap bmpOrig = new Bitmap(strJPGImagePath))
{
bmpDest = new Bitmap(bmpOrig, new Size(100, 200));
}
bmpDest.Save(strJPGImagePath, jgpEncoder, myEncoderParameters);
}
bmpDest.Dispose();
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 for 循环中使用任务,但我遇到了非常奇怪的异常!这是我的代码:
Task[] tasks = new Task[strarrFileList.Length];
for (int ii = 0; ii < strarrFileList.Length; ii++)
{
tasks[ii] = Task.Factory.StartNew(() => mResizeImage2(ii, strarrFileList[ii], intLongSide, jgpEncoder, myEncoderParameters));
}
Task.WaitAll(tasks);
Run Code Online (Sandbox Code Playgroud)
这是错误:
mCPanel.exe 中出现“System.IndexOutOfRangeException”类型的异常,但未在用户代码中处理附加信息:索引超出数组范围。
所以基本上 ii 变得等于 strarrFileList.Length 这不应该!有没有人对此有解释/解决方案?
我正试图检测我的图像中的圆圈.我使用EmguCV在C#中编写了以下代码.它大部分时间都有效,但在某些情况下,它会检测到稍微偏移到一侧的较小或较大的圆圈.
这是我的代码:
Thread.Sleep(1000);
imgCrp.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
imgCrpLab = imgCrp.Convert<Lab, Byte>();
imgIsolatedCathNTipBW = new Image<Gray, Byte>(imgCrp.Size);
CvInvoke.cvInRangeS(imgCrpLab.Split()[2], new MCvScalar(0), new MCvScalar(100), imgIsolatedCathNTipBW);
imgCrpNoBgrnd = imgCrp.Copy(imgIsolatedCathNTipBW.Not());
imgCrpNoBgrndGray = imgCrpNoBgrnd.Convert<Gray, Byte>().PyrUp().PyrDown();
Thread.Sleep(1000);
imgCrpNoBgrndGray.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
Gray cannyThreshold = new Gray(150);
Gray cannyThresholdLinking = new Gray(85);
Gray circleAccumulatorThreshold = new Gray(15);
imgCrpNoBgrndGrayCanny = imgCrpNoBgrndGray.Canny(cannyThreshold.Intensity, cannyThresholdLinking.Intensity);
Thread.Sleep(1000);
imgCrpNoBgrndGrayCanny.Save(DateTime.Now.ToString("yyMMddHHmmss") + ".jpg");
circarrTip = imgCrpNoBgrndGrayCanny.HoughCircles(
cannyThreshold,
circleAccumulatorThreshold,
1, //Resolution of the accumulator used to detect centers of the circles
500, //min distance
15, //min radius
42 //max …Run Code Online (Sandbox Code Playgroud) 我试图找到以下图像的角落:

我试过这段代码:
im = imread('layer2.png');
BW=im2bw(im, 100/256);
BW=~BW;
figure,imshow(BW);title('Original Image');
C = corner(BW,4);
hold on
plot(C(:,1), C(:,2), 'r.', 'MarkerSize',30);
Run Code Online (Sandbox Code Playgroud)
但它检测到错误的角落,如下图所示:

怎么了?如何才能检测到真正的角落?
使用校准方法(Matlab 或 OpenCV),可以找到网络摄像头的焦距。我想知道是否也可以测量网络摄像头的传感器尺寸?
谢谢
我有一个简单的代码可以使用 C# 在 Outlook 2013 中打开撰写电子邮件。当 Outlook 未运行时,它可以正常工作,但当 Outlook 已经打开时,我收到此异常:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Run Code Online (Sandbox Code Playgroud)
这是我的简单代码:
Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem mailItem = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
mailItem.Subject = "This is the subject";
mailItem.To = "someone@example.com";
mailItem.Body = "This is the message.";
mailItem.Display(true);
Run Code Online (Sandbox Code Playgroud)
我也从 Visual Studio 输出窗口得到这些抱怨我不知道的符号!:
Additional information: Retrieving the …Run Code Online (Sandbox Code Playgroud) 我有一个函数可以根据控件名称和输入命令更改控件的属性。
public void SetControl(string ControlName, string Operation)
{
Control Control = this.Controls.Find(ControlName, true)[0];
switch (Operation)
{
case "ok":
Control.BackColor = Color.Green;
Control.ForeColor = Color.Black;
break;
case "error":
Control.BackColor = Color.Red;
Control.ForeColor = Color.Blue;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否还有什么方法可以传递属性名称?当然我可以做这样的事情:
if (propertyname=="ForeColor")
{Control.ForeColor = Color.Black;}
Run Code Online (Sandbox Code Playgroud)
但我应该对我要更改的所有属性执行此操作!有没有办法根据名称查找并更改属性?
有谁知道为什么这段代码会降低用户界面的速度:
Thread trdGenerateTrajectory = new Thread(() => HeavyMethod());
trdGenerateTrajectory.Start();
trdGenerateTrajectory.Join();
Run Code Online (Sandbox Code Playgroud)
这应该是在主线程的单独线程中,我是对的吗?如果是这样,为什么运行它会减慢/冻结UL?
编辑:感谢您的评论.我删除了Join(),但它仍然冻结了UI.任何的想法?
更新:HeavyMethod()方法从我创建的Matlab DLL调用方法.dll中的方法为机器人生成操纵轨迹.我的项目是一个重型机器人项目,与许多硬件/设备进行通信.该项目有12名背景工作者和一名计时器.计时器负责更新UI及其上的所有文本/颜色/图像/ .... 到目前为止,我还没有遇到任何与后台工作者和计时器有关的问题,无论他们运行的任务有多重,我都没有看到任何延迟或停止计时器和UI更新.但是,当我在Matlab dll中调用这个特定的方法时,我看到UI的完全停止正在更新,直到方法完成.这就是我的经历:
然后我意识到我的表单上只有一些文本框遇到了这个问题.他们是那些从同一个Matlab dll的另一个方法获取值的人.那时我才意识到这个问题与线程/后台工作者无关,而且与Matlab运行方法的方式有关.也许是单线程!?无论如何,我可能会有所帮助,如果我为这个生成轨迹的特定方法制作单独的dll,所以我创建了另一个dll,但我遇到了完全相同的问题.似乎Matlab dll一次只能运行一个方法,无论你是从不同的线程调用它们,还是从单独的dll调用它们.我相信我应该在另外的SO问题中提出这个问题,但是,在此期间,你对此有何评论?(更新:我没有收到任何回复所以我发布了一个新问题:同时从一个Matlab dll调用两个函数)