首页 新闻 会员 周边 捐助

高分求教C#画图高手 已知调色板数组和像素alpha实现画图

1
悬赏园豆:200 [待解决问题]
数据类型:
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;
雪地上撒点儿野的主页 雪地上撒点儿野 | 初学一级 | 园豆:5
提问于:2011-11-18 11:37
< >
分享
所有回答(2)
0

这么大的网站没有人能回答 - -

雪地上撒点儿野 | 园豆:5 (初学一级) | 2011-11-19 14:11
0

......你这不会是作业吧....

 

rgbVals[i+2] = (((color & Convert.ToInt32("F800", 16)) >> 4)-rgbVals[i+2]) * alpha/32+rgbVals[i+2];

你写的这行, 和下面的那个程序, 有一点小小的差别. 不知道你发现没.
glshader | 园豆:118 (初学一级) | 2011-11-21 18:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册