Tag: 处理

将图像转换为1bpp时的阈值?

我不知道如何标记这个问题,请尽可能编辑。 作业:创建一个应用程序,可以在批处理运行中自动裁剪图像中的黑色边框。 图像质量从100-300dpi,1bpp-24bpp不等,批次可以从10-10000个图像变化。 计划:将图像转换为1bpp(双色调,黑/白,如果还没有),在“清理”白点/污垢/噪音后找到黑色结束和白色开始的地方,这些是新的坐标图像裁剪,将它们应用于原始图像的克隆。 删除旧图像,保存新图像。 进展:以上所有都已完成,并且有效,但…… 问题:当转换为1bpp时,我无法控制“阈值”值。 我需要这个。 许多黑暗的图像被裁剪得太多了。 尝试:我试过了 Bitmap imgBitonal = imgOriginal.Clone(new Rectangle(0, 0, b.Width, b.Height), PixelFormat.Format1bppIndexed) 还有这个 。 两者都有效,但似乎没有人给我手动设置阈值的可能性。 我需要用户能够设置此值,并在运行批处理之前使用我的“预览”function,以查看设置是否有用。 哭泣:我在这里不知所措。 我现在不做该做什么或怎么做。 请帮助编码员。 指向一个方向,告诉我链接中找到的代码在哪里找到一个阈值(我没有找到一个,或者不知道在哪里看)或者只是给我一些有用的代码。 任何帮助表示赞赏。

理解一次性物体

我已经看过像这样的问题,甚至我发现了很多,其中任何一个都为我提出了这个问题。 我们假设我有这个代码: public class SuperObject : IDisposable { public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { } } 我是否需要在SuperObject上使用protected virtual void Dispose(bool) ? 因为那里真的没有什么可以处理的。 public interface ICustom : IDisposable { } public class Custom : ICustom { public SuperObject Super { get; protected set; } public Custom() { Super = […]

如何从C#执行批处理文件?

(见解决方案) 我不认为这会很难。 我有一个命令文件,d:\ a.cmd,其中包含: copy /bd:\7zS.sfx + d:\config.txt + d:\files.7z d:\setup.exe 但是这些C#行不会执行它: Process.Start(“d:\\a.cmd”); Process.Start(“cmd”, “/cd:\\a.cmd”); 抛出Win32Exception:“%1不是有效的Win32应用程序。” Process.Start打开.pdf文件…为什么不执行命令文件? 如果我在cmd窗口中输入它,这是有效的: cmd /cd:\a.cmd Windows XP,MS Visual Studio 2008。 吉姆,提前谢谢 解决方案我只是轻微尴尬:(有一个名为cmd.exe的文件,在我的应用程序的目录中大小为零。我不知道它是如何到达那里但它现在是吐司,上面的两个C#语句现在都有效。我我找了一本哈利波特的书,这样我就可以从多比那里得到一些自我惩罚的想法……

从catch块中抛出嵌套的exception……这是明智的吗?

我想在我的库中实现自定义exception处理,以便我知道exception发生的位置,所以我这样做: try { DoSomething(); } catch(Exception ex) { //LibraryException refers to any exception in the libraries exception hierarchy throw new LibraryException(ex.Message, ex); } 这应该避免吗? 它有任何性能影响吗? 捕获,嵌套和重新抛出exception有什么含义?

即使调用Close(),为什么在ManualResetEvent上等待的线程会继续等待?

今天我们惊讶地发现等待一个ManualResetEvent线程继续等待事件,即使它已经关闭。 我们原本期望调用Close()会隐式发出等待线程的信号。 我们追踪这一点是因为我们的一些Windows服务没有像我们想的那样快速关闭。 我们正在更改所有关闭ManualResetEvent引用的Dispose实现,先调用Set 。 任何人都可以解释为什么Close不会隐式调用Set ? 你什么时候想要一个等待的线程继续等待? 这是我们的测试代码,用于演示我们的发现: private static readonly Stopwatch _timer = Stopwatch.StartNew(); public static void Test() { var sync = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(state => { Log(“ThreadPool enter, waiting 250ms…”); sync.WaitOne(250); Log(“ThreadPool exit”); }); Log(“Main sleeping 100”); Thread.Sleep(100); Log(“Main about to close”); // sync.Set(); // Is Set called implicitly? No… sync.Close(); Log(“Main […]

如何使程序不显示在Alt-Tab或任务栏上

我有一个需要在后台进行的程序,当用户连接到RDP会话时,它将进行一些环境设置,然后启动程序。 当程序关闭时,它将执行一些内务处理并注销会话。 我目前的做法是让终端服务器启动这个应用程序。 这是作为Windows窗体应用程序构建的,以防止控制台窗口出现: public static void Main() { //(Snip…) Do some setup work Process proc = new Process(); //(Snip…) Setup the process proc.Start(); proc.WaitForExit(); //(Snip…) Do some housecleaning NativeMethods.ExitWindowsEx(0, 0); } 我真的很喜欢这个,因为任务栏中没有任何项目,并且alt-tab中没有任何内容显示。 但是为了做到这一点,我放弃了对void WndProc(ref Message m)等函数的访问void WndProc(ref Message m)所以现在我无法收听Windows消息(如WTS_REMOTE_DISCONNECT或WTS_SESSION_LOGOFF )并且没有用于bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); 我希望我的代码更加健壮,因此如果用户在关闭程序之前注销或断开会话,它将进行大扫除。 关于我如何吃蛋糕和吃它的任何建议?

我是否需要配置SemaphoreSlim

根据文件: “ SemaphoreSlim不使用Windows内核信号量”。 是否有SemaphoreSlim使用的特殊资源,当不再使用SemaphoreSlim时调用Dispose很重要?

声明一个方法总是抛出一个exception?

我有一个像……的方法 int f() { try { int i = process(); return i; } catch(Exception ex) { ThrowSpecificFault(ex); } } 这会产生编译器错误,“并非所有代码路径都返回值”。 但在我的情况下,ThrowSpecificFault()将始终抛出(相应的)exception。 所以我被迫在最后放一个返回值,但这很难看。 首先,这种模式的目的是因为“process()”是对外部Web服务的调用,但需要转换各种不同的exception以匹配客户端的预期接口(我认为是〜外观模式)。 有任何更干净的方法吗?

multithreadingexception和Dispose。 为什么Dispose没有打电话?

‘using’语句保证对象将被称为Dispose方法。 在这个例子中,这没有发生。 终结者方法也没有调用。 为什么这一切? 当其他线程上的exception发生时,我如何更改代码以保证处理我的对象? class Program { static void Main(string[] args) { Thread th1 = new Thread(ThreadOne); Thread th2 = new Thread(ThreadTwo); th1.Start(); th2.Start(); th1.Join(); th2.Join(); } static void ThreadOne() { using (LockedFolder lf = new LockedFolder(@”C:\SomeFodler”)) { // some pay load Thread.Sleep(5000); } } static void ThreadTwo() { // some pay load Thread.Sleep(1000); […]

C#/ mono:获取Windows和Linux上的子进程列表

我有以下代码通过与ntdll交互获取Windows上的子进程列表。 在Linux上有没有相当于’NtQueryInformationProcess’的东西,它是我指定进程的父进程的进程ID(如pbi.InheritedFromUniqueProcessId)? 我需要通过Mono在Linux上运行代码,所以我希望我只需要更改获得父进程ID的部分,以便代码与Windows上的代码保持一致。 public IList GetChildren( Process parent ) { List children = new List(); Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { ProcessBasicInformation pbi = new ProcessBasicInformation(); try { uint bytesWritten; NtQueryInformationProcess(p.Handle, 0, ref pbi, (uint)Marshal.SizeOf(pbi), out bytesWritten); // == 0 is OK if (pbi.InheritedFromUniqueProcessId == parent.Id) children.AddRange(GetChildren(p)); } catch { } […]