数据类型:
struct Pixel{Byte Alpha;Int Index;}
已知数据:
Int w,h;//已知的图像大小
Int16[] pal;//已知的图像的调色板数据
Pixel[] ps;//已知的图像的像素数组(Index为pal的索引)
求:Bitmap
我是这样弄的肯定是不行 请不吝赐教
Bitmap bmp=new Bitmap(w,h);
Rectangle rect=new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData=bmp.LockBits(rect, ImageLockMode.ReadWrite,bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbVals=new byte[bytes];
Int16 color;
byte alpha;
for(int i=0;i<rgbVals.Length;i+=3){
color=pal[ps[i].Index];
alpha = ps[i].Alpha];
rgbVals[i] = (((color & Convert.ToInt32("001F", 16)) << 3)-rgbVals[i]) * alpha/32+rgbVals[i];
rgbVals[i+1]=(((color & Convert.ToInt32("07E0", 16)) >> 3)-rgbVals[i+1])*alpha/32+rgbVals[i+1];
rgbVals[i+2] = (((color & Convert.ToInt32("F800", 16)) >> 4)-rgbVals[i+2]) * alpha/32+rgbVals[i+2];
}
Marshal.Copy(rgbValues, 0, ptr, bytes);
bmp.UnlockBits(bmpData);
主要是循环部分 不知道怎么取rgb值 请高手花点心思帮忙揣摩一下
翘首以盼 得蒙教益不盛感谢
可参考:http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx
循环部分可参考Delphi代码:
Dest: TBitmap;
pDest: PByteArray;
Color: Word;
Alpha: Byte;
for i:=0 to h-1 do
begin
pDest := Dest.ScanLine[i];
for j:=0 to w-1 do
begin
Color := pal[ps[i*w+j].Index];
Alpha := ps[i*w+j].Alpha;
pDest[0] := (((Color and $001F) shl 3) - pDest[0]) * Alpha div 32 + pDest[0];
pDest[1] := (((Color and $07E0) shr 3) - pDest[1]) * Alpha div 32 + pDest[1];
pDest[2] := (((Color and $F800) shr 8) - pDest[2]) * Alpha div 32 + pDest[2];
Inc(LongWord(pDest), 3);
end;
end;
这么大的网站没有人能回答 - -
......你这不会是作业吧....
rgbVals[i+2] = (((color & Convert.ToInt32("F800", 16)) >> 4)-rgbVals[i+2]) * alpha/32+rgbVals[i+2];
你写的这行, 和下面的那个程序, 有一点小小的差别. 不知道你发现没.