for (int i = 0 ; i < bmp.Height * bmp.Width; ++i) {
int row = i / bmp.Height;
int col = i % bmp.Width;
if (row%2 != 0) col = bmp.Width - col-1;
var pixel = bmp.GetPixel(col, row);
}
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
// ...
Color[,] GetSection(Image img, Rectangle r) {
Color[,] r = new Color[r.Width, r.Height]; // Create an array of colors to return
using (Bitmap b = new Bitmap(img)) { // Turn the Image into a Bitmap
BitmapData bd = b.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); // Lock the bitmap data
int[] arr = new int[b.Width * b.Height - 1]; // Create an array to hold the bitmap's data
Marshal.Copy(bd.Scan0, arr, 0, arr.Length); // Copy over the data
b.UnlockBits(bd); // Unlock the bitmap
for (int i = 0; i < arr.Length; i++) {
r[i % r.Width, i / r.Width] = Color.FromArgb(arr[i]); // Copy over into a Color structure
}
}
return r; // Return the result
}
字符集 你可以这样称呼它:
Color[,] c = GetSection(myImage, new Rectangle(0, 0, 100, 100)); // Get the upper-left 100x100 pixel block in the image myImage
for (int x = 0; x < c.GetUpperBound(0); x++) {
for (int y = 0; y < c.GetUpperBound(1); y++) {
Color thePixel = c[x, y];
// do something with the color
}
}
for(int y = 0; y < bmp.Height; y++)
{
var even = y % 2 == 0;
var startX = even ? 0 : bmp.Width - 1;
var endX = even ? bmp.Width : -1;
var delta = even ? 1 : -1;
for(int x = startX; x != endX; x += delta)
{
var pixel = bmp.GetPixel(x,y);
}
}
字符集 或者你可以把内部循环拆分为:从左到右和从右到左
for(int y = 0; y < bmp.Height; y += 2)
{
for(int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x,y);
}
var line = y + 1;
if(line < bmp.Height)
{
for(int x = bmp.Width; x >= 0; --x)
{
var pixel = bmp.GetPixel(x,line);
}
}
}
8条答案
按热度按时间snz8szmq1#
当你想对巨大的图像进行图像处理时,GetPixel()方法需要很长时间,但我认为我的算法比其他答案需要更少的时间,例如,你可以在800 * 600像素的图像上测试此代码。
字符集
hrirmatl2#
如果你想在一个循环中右,左,右,.遍历它,这就可以做到:
字符集
woobm2wo3#
你需要使用两个循环:
字符集
wkyowqbh4#
你可以使用Linq选择来获得一个IE对象:
字符集
.然后在IE浏览器上运行(使用隐式类型):
型
sq1bmfud5#
你可以把它变成一个易于访问的多维颜色数组,如下所示:
字符集
你可以这样称呼它:
型
你可以在任何方向快速遍历返回的数组。
htzpubme6#
虽然两个嵌套循环的方法通常“更好”或更具可读性,但您可以在1个循环中这样做:
字符集
或者稍微好一点,将第一行改为:
型
3duebb1j7#
你可以试试这样
字符集
或者你可以把内部循环拆分为:从左到右和从右到左
型
eeq64g8w8#
在BMP(位图图像)文件中,您可以将遍历像素视为在组成图像的各个点之间导航。BMP是一种光栅图形格式,这意味着它将图像存储为像素网格,每个像素代表特定的颜色。
下面是一个分步指南,帮助您了解如何在BMP图像中的像素之间“旅行”:
打开BMP文件:首先,您需要使用可以处理BMP文件的图像查看器或处理软件打开BMP文件。
导航到特定像素:打开图像后,您可以通过将光标或指针移动到图像上来导航到特定像素。大多数图像查看软件会在您将鼠标悬停在图像上时显示像素坐标(X和Y)。这允许您定位特定像素。
了解像素信息:要了解像素,您需要知道其颜色信息。BMP图像中的像素通常由红色、绿色和蓝色(RGB)值组成。这些值决定像素的颜色。当您单击像素时,通常可以在软件的信息面板或对话框中找到这些值。
在像素之间移动:您可以通过在图像上移动光标来遍历像素。您悬停或选择的每个像素都将显示其RGB值,允许您探索图像中各个点的颜色。
修改像素(可选):在某些图像编辑软件中,您还可以选择修改单个像素的颜色。这可能涉及更改RGB值以创建不同的颜色。
放大/缩小:要更仔细地查看单个像素,您可以放大图像。如果您正在使用高分辨率BMP图像,这可能特别有用。
BMP图像可能非常大,可能包含数百万像素。单独浏览每个像素可能非常耗时,因此图像编辑软件通常提供各种工具来更有效地处理像素,例如画笔,选择工具和过滤器。
请记住,BMP文件通常用于简单的图像,图标或作为编辑的中间格式,但与JPEG或PNG等压缩图像格式相比,它们往往具有更大的文件大小。