Graphics g;
using (var bmp = new Bitmap(_frame, _height, PixelFormat.Format24bppRgb))
{
var data = bmp.LockBits(new Rectangle(0, 0, _frame, _height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
var bmpWidth = data.Stride;
var bytes = bmpWidth * _height;
var rgb = new byte[bytes];
var ptr = data.Scan0;
Marshal.Copy(ptr, rgb, 0, bytes);
for (var i = 0; i < _frame; i++)
{
var i3 = (i << 1) + i;
for (var j = 0; j < _height; j++)
{
var ij = j * bmpWidth + i3; …Run Code Online (Sandbox Code Playgroud) 我正在努力优化我正在研究的程序,该程序当前使用锁定位读取字节数据,但使用setPixel写入像素数据.那么我如何实际修改我正在阅读的像素数据呢?如果我尝试设置pp,cp或np,该方法将无法工作(因为它循环并需要pp,cp和np来表示像素数据),所以我完全感到困惑.我是否需要将像素数据写入byte []并对其进行操作,或者是什么?
这是一个代码示例:
BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int scaledPercent = (int)(Math.Round(percentageInt * 255)) - 47;
Debug.WriteLine("percent " + scaledPercent);
unsafe
{
Debug.WriteLine("Woah there, unsafe stuff");
byte* prevLine = (byte*)data.Scan0;
byte* currLine = prevLine + data.Stride;
byte* nextLine = currLine + data.Stride;
for (int y = 1; y < img.Height - 1; y++)
{
byte* pp = prevLine + 3;
byte* cp = currLine + 3;
byte* np = nextLine + 3;
for (int x …Run Code Online (Sandbox Code Playgroud) 在部署之前,我使用XP VM和Vista VM对我的应用程序进行烟雾测试.这两款VM都使用32位色.不确定它是否有任何区别,但我正在使用VirtualBox.每台机器还分配2GB内存,2个处理器.XP有128MB的视频RAM,Vista 256(在每种情况下我可以设置它们的最大值).运行机器的桌面有6个内核和16GB内存.同样,不确定这些信息是否相关但谁知道.
以下是我使用的扩展方法,以便将一个Bitmap像素转换为可以直接使用的像素.因为,毕竟我们需要速度.速度是我们所需要的.油腻,速度快!和Bitmap.GetPixel是相反的.
public static ArgbColor[] GetPixels(this Bitmap bitmap)
{
ArgbColor[] results;
int width;
int height;
BitmapData bitmapData;
width = bitmap.Width;
height = bitmap.Height;
results = new ArgbColor[width * height];
bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
ArgbColor* pixelPtr;
pixelPtr = (ArgbColor*)(void*)bitmapData.Scan0;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
results[row * width + col] = *pixelPtr;
pixelPtr++;
}
} …Run Code Online (Sandbox Code Playgroud) 编辑:我非常感谢您的回复。这里我最需要的是示例代码,用于说明我如何处理嵌套循环中的几行代码,因为这是在 GetPixel/SetPixel 中可以正常工作的,但也是我无法使用 Lockbits 正常工作的。谢谢
我正在尝试将图像处理过滤器从 GetPixel / SetPixel 转换为 Lockbits,以缩短处理时间。 我也在 Stack Overflow、MSDN 和其他网站上看到过 Lockbits 教程,但我做错了。 我从一个非常简单的滤镜开始,它只是减少绿色以创建红色和紫色效果。这是我的代码:
private void redsAndPurplesToolStripMenuItem_Click(object sender, EventArgs e)
{
// Get bitmap from picturebox
Bitmap bmpMain = (Bitmap)pictureBoxMain.Image.Clone();
// search through each pixel via x, y coordinates, examine and make changes. Dont let values exceed 255 or fall under 0.
for (int y = 0; y < bmpMain.Height; y++)
for (int x = 0; x < bmpMain.Width; x++)
{
bmpMain.GetPixel(x, y);
Color c = …Run Code Online (Sandbox Code Playgroud) 我正从一些相机(RAW数据阵列)捕获数据.
然后我根据调色板将这些数据映射到RGB值.
我需要尽可能快地映射它,所以我使用BitmapDdata指针在不安全的代码片段中使用和编辑像素.
public void dataAcquired(int[] data)
{
Bitmap bmp = new Bitmap(width, height);
BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
for (int i = 0; i < data.Length; i++)
{
int x = i % bmp.Width;
int y = i / bmp.Width;
Rgb rgb = mapColors[data[i]];
unsafe
{
byte* ptr = (byte*)data.Scan0;
ptr[(x * 3) + y * data.Stride] = rgb.b;
ptr[(x * 3) + y * data.Stride + 1] = rgb.g;
ptr[(x * …Run Code Online (Sandbox Code Playgroud) c# ×5
lockbits ×5
performance ×2
argb ×1
bitmap ×1
bitmapdata ×1
gdi+ ×1
getpixel ×1
graphics ×1
image ×1
picturebox ×1
pixel ×1