提问人: 提问时间:12/25/2008 最后编辑:Andreas Grech 更新时间:12/30/2008 访问量:733
像素编程继续
Pixel Programming continued
答:
1赞
user21826
12/25/2008
#1
效果(未经测试)
private Bitmap createImage(int width, int height, byte[] image)
{
int index = 0;
byte r, g, b;
Bitmap bmp = new Bitmap(width, height);
for (y as int = 0; y < height; y++)
{
for (x as int = 0; x < width; x++)
{
b = image[y * width + index];
g = image[y * width + index + 1];
r = image[y * width + index + 2];
bmp.SetPixel(x, y, Color.FromArgb(255, r, g, b));
index += 3;
}
}
return bmp;
}
0赞
lc.
12/25/2008
#2
该类的构造函数可能会有所帮助。当然,这取决于数据在数组中的存储方式。Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0)
Bitmap
1赞
Jader Dias
12/30/2008
#3
你可能需要这样的东西:
public static Bitmap TransformBGRArrayToBitmap(byte[] inputValues, int Width, int Height, int Stride)
{
Bitmap output = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, Width, Height);
BitmapData outputData = output.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, output.PixelFormat);
// Get the address of the first line.
IntPtr outputPtr = outputData.Scan0;
// Declare an array to hold the bytes of the bitmap.
byte[] outputValues = new byte[outputData.Stride * output.Height];
int inputBytesPP = (1 * Stride) / Width;
int outputBytesBPP = (1 * outputData.Stride) / output.Width;
// Copy the RGB values into the array.
for (int inputByte = 0, outputByte = 0; inputByte < inputValues.Length; inputByte += inputBytesPP, outputByte += outputBytesBPP)
{
//The logic inside this loop transforms a 32 bit ARGB Bitmap into an 8 bit indexed Bitmap
//So you will have to replace it
/*byte pixel = 0x00;
if (inputValues[inputByte] > 0x7F)
{
if (inputValues[inputByte + 1] > 0x7F)
pixel |= 0x01;
if (inputValues[inputByte + 2] > 0x7F)
pixel |= 0x02;
if (inputValues[inputByte + 3] > 0x7F)
pixel |= 0x04;
if ((inputValues[inputByte + 1] & 0x7F) > 0x3F)
pixel |= 0x02;
if ((inputValues[inputByte + 2] & 0x7F) > 0x3F)
pixel |= 0x04;
if ((inputValues[inputByte + 3] & 0x7F) > 0x3F)
pixel |= 0x08;
}
else
pixel = 0x10;
outputValues[outputByte] = pixel;*/
}
System.Runtime.InteropServices.Marshal.Copy(outputValues, 0, outputPtr, outputValues.Length);
output.UnlockBits(outputData);
return output;
}
评论