- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
部分代码:
锁定位图数据的函数:
public static BitmapData LockData(Bitmap bitmap)
{
Rectangle bitmapRect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapData = bitmap.LockBits(bitmapRect, ImageLockMode.ReadWrite, bitmap.PixelFormat);
return bitmapData;
}
解锁 bitnapData 的函数:
public static void UnlockData(Bitmap bitmap, BitmapData bitmapData)
{
bitmap.UnlockBits(bitmapData);
}
改变图像亮度的函数:
public static void Bright(int bright, BitmapData bitmapData, BackgroundWorker worker, DoWorkEventArgs e)
{
byte nPixelFormat = 0;
if (bitmapData.PixelFormat == PixelFormat.Format24bppRgb) nPixelFormat = 3;
else if (bitmapData.PixelFormat == PixelFormat.Format32bppArgb) nPixelFormat = 4;
int max = bitmapData.Height - 1;
int percent = 0;
unsafe
{
for (int y = 0; y < bitmapData.Height; y++)
{
byte* pBmpRow = (byte*)(bitmapData.Scan0 + y * bitmapData.Stride);
for (int x = 0; x < bitmapData.Width; x++)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
int bVal = pBmpRow[nPixelFormat * x] + bright;
int gVal = pBmpRow[nPixelFormat * x + 1] + bright;
int rVal = pBmpRow[nPixelFormat * x + 2] + bright;
Clamp(ref bVal);
Clamp(ref gVal);
Clamp(ref rVal);
pBmpRow[nPixelFormat * x] = (byte)bVal;
pBmpRow[nPixelFormat * x + 1] = (byte)gVal;
pBmpRow[nPixelFormat * x + 2] = (byte)rVal;
}
//System.Threading.Thread.Sleep(5);
int curPercent = (y * 100) / max;
if (curPercent > percent)
{
percent = curPercent;
worker.ReportProgress(percent);
}
}
}
}
在这个函数中,我正在检查 backgroundWorker 中止和更新进度。
现在我有了 w trackbar 和 numericBox,我用它来改变亮度。当 trackbar 或 numericBox 值改变时,backgroundWorker 启动。问题是,当 backgroundWorker 很忙并且我更改了 trackbarValue 时,backgroundWorker 应该停止并重新启动。现在在我的代码中它可以使用 liku 按钮。当 worker 忙碌时,值更改会停止 worker,然后下一次值更改会启动它。
代码:
private void OnNumericBoxValueChanged(object sender, EventArgs e)
{
m_trkBarBright.Value = (int)m_numericBright.Value;
brightValue = m_trkBarBright.Value;
if (backgroundWorker.IsBusy)
{
backgroundWorker.CancelAsync();
}
else
{
backgroundWorker.RunWorkerAsync();
}
m_btnOK.Focus();
}
private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
Colors.CopyImgData(m_orgImage, m_tempImage);
data = Colors.LockData(m_tempImage);
Colors.Bright(brightValue, data,worker, e);
}
private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Colors.UnlockData(m_tempImage, data);
MessageBox.Show(e.Error.Message);
progressBar1.Value = 0;
}
else if (e.Cancelled)
{
Colors.UnlockData(m_tempImage, data);
if(!exit)
m_imgBox.UpdateImage(m_tempImage);
MessageBox.Show("Canceled");
progressBar1.Value = 0;
}
else
{
Colors.UnlockData(m_tempImage, data);
if (!exit)
m_imgBox.UpdateImage(m_tempImage);
progressBar1.Value = 0;
MessageBox.Show("Done");
}
}
private void WorkerProgress(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
有人知道如何解决这个问题吗?
最佳答案
执行此操作的正确方法是检查 backgroundWorker.CancellationPending
并从 WorkerDoWork
设置 e.Cancel = true
。
CancelAsync
不会停止 worker,它只是向线程发送一条消息说“我想停止”。
这是一个full sample .
关于c# backgroundWorker 和 trackBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261420/
这可能是一个非常全局化的问题,但我们开始吧: 我想知道如何制作像 Virtualbox 这样的轨迹栏。它们在底部有一个带有自定义颜色的轨迹栏,以显示您是否为虚拟系统分配了过多的 RAM。 现在我的问题
我想知道如何使我的第二个 trackbar.position 镜像与 trackbar1.position 方向相反。例如。范围从 1 到 100。 所以当TrackBar1.Position :=
我无法将 TTrackBar 拇指大小调整为更大的大小。看图: 我的左边有一个小拇指,我无法将其变大(但不能将 TrackBar 本身变大)。 所需的拇指尺寸显示在带有红色区域的图像上。 也许我可以以
TrackBar 控件的变化方向与它在被更改时应该的方向相反:向上翻页/向下翻页/向上箭头/向下箭头。 这里有详细介绍: Why does the Trackbar value decrease on
我在这里要做的是像 Windows XP 上的那样放下一个轨迹栏来更改分辨率:( http://puu.sh/7Li5h.png ) 我想设置特定的间隔/增量值,如上图所示。目前,实际栏下方的线条已经
我用 C# 在 Winform 项目上添加了一个轨迹栏。 mySlider.Minimum = 0; mySlider.Maximum = 200; mySlider.Value = 30; mySl
我的 WinForms 程序中有一个轨迹栏,通过移动它可以刷新一个巨大且耗时的方法。看看这段代码: trackBar_ValueChanged(object sender, EventArgs e)
我想用opencv做前景分割。我编写了带有轨迹条的代码,这样我就可以找到最佳的分割参数。执行代码时它会工作,图像显示时带有标记的轮廓等。但是当我尝试在轨迹栏上移动条时。我收到以下错误。 OpenCV(
部分代码: 锁定位图数据的函数: public static BitmapData LockData(Bitmap bitmap) { Rectangle bitmap
我对后台工作人员有疑问。我有一个 trackbar,当用户改变它的值时,一个新的 backgroundworker 就会启动。有一个包含所有后台 worker 的列表,当启动一个新的后台 worker
我只是想知道您是否可以帮我解决这个问题。 在我的程序中,我必须使用 paint 事件来绘制一条充当“炮塔”的线。我必须使用轨迹栏来选择我将“开火”这个炮塔的角度。我的问题是我不确定如何编写代码以便每次
我遇到了一个奇怪的问题,希望有人能给我解释一下,这样我以后就可以避免了。当我放置多个轨迹条(在我的例子中是 6 个)时,最后一个轨迹条要短得多。这是基本代码: import cv2 def nothi
如何在轨迹栏窗口上显示条的范围(最大、最小)和当前指向值?这是使用轨迹栏的示例。 # trackbar import cv2 import numpy as np def nothing(x):
如何禁用鼠标滚轮在轨迹栏上的值更改?在界面上向下滚动时,用户可能会错误地更改轨迹栏值我正在使用 Windows 窗体 c#。我找不到任何属性来阻止此事件.. 最佳答案 我解决了这个问题:使用正常的事件
我正在研究 Hough Circle 函数。基本上我可以使用 4 个参数来获得我想要的正确圆。 所以我想到要创建一个跟踪条来监视正在处理的图像的状态。 所以我这样修改了我的代码 #include #
我从 openCV documentation site 复制了 Harris 角点检测器的代码,但我想让轨迹栏及其输出出现在同一个窗口中,所以我将代码更新为 #include "stdafx.h"
我有一个任务说“使用轨迹栏选择三种颜色。将 Blob 涂成相应的颜色。” 我已经创建了轨迹栏,它们工作正常,但我该如何完成这项任务?不幸的是,他们在类里面没有给我们足够的信息来解决这个问题。 非常感谢
我想逐帧显示电影,并使用 Trackbars 对帧进行一些形态学操作。在创建相应的结构化元素之前,我需要指定其特征,例如长度、度数 和迭代次数 我的代码: import cv2 video = cv2
目前,我有许多用于更改图像值的 slider 。我正在为 slider 使用 OpenCV 轨迹栏,它对我的每个 slider 都有一个不同函数的回调。我想让我的 slider 回调指向一个回调函
我正在尝试使用 slider 来控制 HSV 掩蔽的下限和上限。我能够获得 slider ,但无法使其保持在我设置的位置;每次拉入新帧时,它都会回到零。 import numpy as np impo
我是一名优秀的程序员,十分优秀!