我在Silverlight中有一个BitmapImage实例,我试图找到一种方法来读取图像中每个像素的颜色信息。我怎样才能做到这一点?我看到这个类上有一个CopyPixels()
方法将像素信息写入你传递的数组中,但我不知道如何从该数组中读取颜色信息。
我该怎么做?
答案 0 :(得分:2)
在Silverlight 3中查找WriteableBitmap
类。该类有一个成员Pixels
,它在int数组中返回位图的像素数据。
带变换的示例。 bi
是BitmapImage
个对象。
Image img = new Image();
img.source = bi;
img.Measure(new Size(100, 100));
img.Arrange(new Rect(0, 0, 100, 100));
ScaleTransform scaleTrans = new ScaleTransform();
double scale = (double)500 / (double)Math.Max(bi.PixelHeight, bi.PixelWidth);
scaleTrans.CenterX = 0;
scaleTrans.CenterY = 0;
scaleTrans.ScaleX = scale;
scaleTrans.ScaleY = scale;
WriteableBitmap writeableBitmap = new WriteableBitmap(500, 500);
writeableBitmap.Render(img, scaleTrans);
int[] pixelData = writeableBitmap.Pixels;
答案 1 :(得分:0)
目前发布的Silverlight 3测试版中的当前Bitmap API无法实现这一点。
Silverlight BitmapImage文件没有CopyPixels方法。请参阅MSDN文档here。
答案 2 :(得分:0)
首先,您应该使用WritableBitmap
来获取像素集合:WriteableBitmap bmp = new WriteableBitmap(bitmapImageObj);
。每个像素表示为32位整数。我已经制作了结构,这有助于将整数分成四个字节(ARGB)。
struct BitmapPixel
{
public byte A;
public byte R;
public byte G;
public byte B;
public BitmapPixel(int pixel)
: this(BitConverter.GetBytes(pixel))
{
}
public BitmapPixel(byte[] pixel)
: this(pixel[3], pixel[2], pixel[1], pixel[0])
{
}
public BitmapPixel(byte a, byte r, byte g, byte b)
{
this.A = a;
this.R = r;
this.G = g;
this.B = b;
}
public int ToInt32()
{
byte[] pixel = new byte[4] { this.B, this.G, this.R, this.A };
return BitConverter.ToInt32(pixel, 0);
}
}
以下是如何使用它来更改红色值的示例:
BitmapPixel pixel = new BitmapPixel(bmp.Pixels[0]);
pixel.R = 255;
bmp.Pixels[0] = pixel.ToInt32();
另外我想提一下WriteableBitmap.Pixels是预乘RGB格式。 This文章将解释它的含义。以下是使用BitmapPixel结构进行补偿的方法:
public static void CompensateRGB(int[] pixels)
{
for (int i = 0; i < pixels.Length; i++)
{
BitmapPixel pixel = new BitmapPixel(pixels[i]);
if (pixel.A == 255 || pixel.A == 0)
continue;
if (pixel.R == 0 && pixel.G == 0 && pixel.B == 0)
{
// color is unrecoverable, get rid of this
// pixel by making it transparent
pixel.A = 0;
}
else
{
double factor = 255.0 / pixel.A;
pixel.A = 255;
pixel.R = (byte)(pixel.R * factor);
pixel.G = (byte)(pixel.G * factor);
pixel.B = (byte)(pixel.B * factor);
}
pixels[i] = pixel.ToInt32();
}
}