游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2313|回复: 1

求助:怎么实现RGBA数据流显示并应用好ALPHA通道效果

[复制链接]

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2011-5-20 19:58:00 | 显示全部楼层 |阅读模式
俺最近碰到个问题:另一程序传递了一个RGBA格式的图形数据流过来给我,我要任务是要显示出来,数据流长度为0x2400byte,图的高36,宽64.折算一下数据流长度是刚好0x2400byte。36x64=2304x4=9216=0x2400byte.每像素4位。

我现在的显示方式是这样:按顺序读取流数据:第1位Alpha值忽略不用,接下来的R/G/B各一字节拿来换算成Color,然后在Bitmap的画布上直接把COLOR赋值到对应的像素上去。

问题:颜色、图形的样子,都有偏差。估计是alpha通道值没应用起来的原因。

现在求高手指教,如果要用用上alpha值,该怎么用?是否有算法可以把RGBA数据转换成WINDOWS下的color?

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2011-5-20 20:03:00 | 显示全部楼层

Re: 求助:怎么实现RGBA数据流显示并应用好ALPHA通道效果

我的实现代码

  1. function RGB2Color(RGB: TRGB): TColor;
  2. begin
  3.   with rgb do
  4.   begin
  5.     Result := (Blue shl 16) or (Green shl 8) or Red;
  6.   end; //   with
  7. end;

  8. procedure TmainForm.btn55Click(Sender: TObject);
  9. var
  10.   p: PChar;
  11.   ms: TMemoryStream;
  12.   bm: TBitmap;
  13.   jpeg1: TJpegImage;
  14.   c: TColor;
  15.   A, R, B, G: byte;
  16.   RGB1: TRGB;
  17.   i, j: integer;
  18. begin
  19. p := GetLastImageData();//取数据流BUFF
  20.   if p = nil then
  21.   begin
  22.     Logit('返回空指针!');
  23.     exit;
  24.   end;
  25.   ms := TMemoryStream.Create;
  26.   try
  27.     ms.Write(p^, $2400);//写入Stream
  28.     ms.Position := 0;
  29.     bm := TBitmap.Create;
  30.     bm.Height := 36;
  31.     bm.Width := 64;//位图控件
  32.     //bm.PixelFormat := pf24bit;
  33.     for i := 0 to 35 do
  34.       for j := 0 to 63 do
  35.       begin
  36.         ms.Read(A, 1);//从流里读出内容,四字节一像素
  37.         ms.Read(R, 1);
  38.         ms.Read(G, 1);
  39.         MS.Read(B, 1);
  40.         RGB1.Blue := B;
  41.         RGB1.Red := R;
  42.         RGB1.Green := G;
  43.         c := RGB2Color(RGB1);//转换成COLOR
  44.         bm.Canvas.Pixels[j, i] := c;//写入画板
  45.       end;
  46.     jpeg1 := TJpegImage.Create;
  47.     jpeg1.Assign(bm);
  48.     bm.Free;
  49.     img1.Stretch := true;
  50.     img1.Picture.Assign(jpeg1);
  51.     jpeg1.SaveToFile('d:\text.jpg');
  52.     jpeg1.Free;
  53.   finally
  54.     //Dispose(p);
  55.     ms.Free;
  56.   end;
  57. end;
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 06:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表