获得RGB排列的图像在C# [英] Getting RGB array from image in C#
问题描述
我目前正在写我所用Java编写的小程序的C#实现。
我已经使用 BufferedImage.getRGB(INT运行startx,诠释startY,诠释W,INT小时,INT [] rgbArray,诠释抵消,诠释扫描尺寸)
函数我java的app.But我不能准确找到在C#中的版本这一点,我不知道怎么写呢manually.Need手。
I'm currently writing an C# implementation of a little program which i have written in Java.
I had used BufferedImage.getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)
function in my java app.But i couldn't exactly find a version of this in C# and i'm not sure how to write it manually.Need a hand.
推荐答案
有不是在.NET Framework这种方法直接等同。但是,如果你的形象是一个System.Drawing.Bitmap,你可以调用LockBits方法,这将返回的BitmapData结构,包含第一扫描线的地址。然后,您可以使用它来创建什么应该是一个API兼容包装。我假设你正在使用C#3.5或更高版本,所以我使用的扩展方法 - 如果你使用的是旧的味道,从位图参数丢弃这个此更改为普通的方法:
There's not a direct equivalent in the .NET Framework to this method. However, if your image is a System.Drawing.Bitmap, you can call the LockBits method, and this will return a BitmapData structure that contains the address of the first scanline. You can then use it to create what should be an API-compatible wrapper. I'm assuming you're using C# 3.5 or greater, so I'm using an extension method - if you're using an older flavor, change this to a regular method by dropping the 'this' from the Bitmap argument:
public static void getRGB(this Bitmap image, int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)
{
const int PixelWidth = 3;
const PixelFormat PixelFormat = PixelFormat.Format24bppRgb;
// En garde!
if (image == null) throw new ArgumentNullException("image");
if (rgbArray == null) throw new ArgumentNullException("rgbArray");
if (startX < 0 || startX + w > image.Width) throw new ArgumentOutOfRangeException("startX");
if (startY < 0 || startY + h > image.Height) throw new ArgumentOutOfRangeException("startY");
if (w < 0 || w > scansize || w > image.Width) throw new ArgumentOutOfRangeException("w");
if (h < 0 || (rgbArray.Length < offset + h * scansize) || h > image.Height) throw new ArgumentOutOfRangeException("h");
BitmapData data = image.LockBits(new Rectangle(startX, startY, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, PixelFormat);
try
{
byte[] pixelData = new Byte[data.Stride];
for (int scanline = 0; scanline < data.Height; scanline++)
{
Marshal.Copy(data.Scan0 + (scanline * data.Stride), pixelData, 0, data.Stride);
for (int pixeloffset = 0; pixeloffset < data.Width; pixeloffset++)
{
// PixelFormat.Format32bppRgb means the data is stored
// in memory as BGR. We want RGB, so we must do some
// bit-shuffling.
rgbArray[offset + (scanline * scansize) + pixeloffset] =
(pixelData[pixeloffset * PixelWidth + 2] << 16) + // R
(pixelData[pixeloffset * PixelWidth + 1] << 8) + // G
pixelData[pixeloffset * PixelWidth]; // B
}
}
}
finally
{
image.UnlockBits(data);
}
}
这包装,现在可以这样调用:
This wrapper can now be called like this:
Bitmap foo = Bitmap.FromFile(@"somefile.jpg") as Bitmap;
int[] rgbArray = new int[100];
foo.getRGB(1, 1, 10, 10, rgbArray, 0, 10);
希望这会有所帮助,并欢迎到.NET!
Hope this helps, and welcome to .NET!
这篇关于获得RGB排列的图像在C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!