在 C# .Net 中等效于 setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height)?
Equivalent of setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height) in C# .Net?
我正在尝试将一些 Java 代码转换为应用程序的 C#。我似乎无法在 C# .NET 中的 android.Graphics.Bitmap 中找到与 setPixels 方法完全等效的方法。
这里是 Java 代码:
BitMatrix result = some code .....
int w = result.getWidth();
int h = result.getHeight();
int[] pixels = new int[w * h];
for (int y = 0; y < h; y++) {
int offset = y * w;
for (int x = 0; x < w; x++) {
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
}
}
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);
这是我将其转换为 C# 的尝试:
int w = result.Width;
int h = result.Height;
int[] pixels = new int[w * h];
for (int y = 0; y < h; y++)
{
int offset = y * w;
for (int x = 0; x < w; x++)
{
pixels[offset + x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();
}
}
Bitmap bitmap = new Bitmap(w, h);
// how to convert the line below
bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);
我应该如何将最后一行转换为 C#。有什么建议吗?
最简单的解决方案是更换
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
和
bitmap.SetPixel(x, y, result[x, y] ? Color.Black : Color.White);
这会很慢,因为它需要为每个像素集锁定一些。您还需要先创建位图。
一种更快的方法是使用不安全代码来获取指向位图数据的指针。参见 fast work with bitmaps。假设一个 Argb 颜色位图
var bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
byte* scan0 = (int*)bData.Scan0.ToPointer();
for (int y = 0; y < bData.Height; ++y)
{
var rowPtr = scan0 + y * bData.Stride * 4;
for (int x = 0; x < bData.Width; ++x)
{
rowPtr[x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();
}
}
我正在尝试将一些 Java 代码转换为应用程序的 C#。我似乎无法在 C# .NET 中的 android.Graphics.Bitmap 中找到与 setPixels 方法完全等效的方法。
这里是 Java 代码:
BitMatrix result = some code .....
int w = result.getWidth();
int h = result.getHeight();
int[] pixels = new int[w * h];
for (int y = 0; y < h; y++) {
int offset = y * w;
for (int x = 0; x < w; x++) {
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
}
}
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);
这是我将其转换为 C# 的尝试:
int w = result.Width;
int h = result.Height;
int[] pixels = new int[w * h];
for (int y = 0; y < h; y++)
{
int offset = y * w;
for (int x = 0; x < w; x++)
{
pixels[offset + x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();
}
}
Bitmap bitmap = new Bitmap(w, h);
// how to convert the line below
bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);
我应该如何将最后一行转换为 C#。有什么建议吗?
最简单的解决方案是更换
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
和
bitmap.SetPixel(x, y, result[x, y] ? Color.Black : Color.White);
这会很慢,因为它需要为每个像素集锁定一些。您还需要先创建位图。
一种更快的方法是使用不安全代码来获取指向位图数据的指针。参见 fast work with bitmaps。假设一个 Argb 颜色位图
var bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
byte* scan0 = (int*)bData.Scan0.ToPointer();
for (int y = 0; y < bData.Height; ++y)
{
var rowPtr = scan0 + y * bData.Stride * 4;
for (int x = 0; x < bData.Width; ++x)
{
rowPtr[x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();
}
}