计算机二级DELPHI技巧:GDI 在Delphi程序的应用计算机二级考试

文章作者 100test 发表时间 2009:05:13 17:43:37
来源 100Test.Com百考试题网


  2009年下半年全国计算机等级考试你准备好了没?考计算机等级考试的朋友,2009年下半年全国计算机等级考试时间是2009年9月19日至23日。更多优质资料尽在百考试题论坛 百考试题在线题库
  实现图像浮雕效果的一般原理是,将图像上每个像素点与其对角线的像素点形成差值,使相似颜色值淡化,不同颜色值突出,从而产生纵深感,达到浮雕的效果,具体的做法是用处于对角线的2个像素值相减,再加上一个背景常数,一般为128而成。这种算法的特点是简单快捷,缺点是不能调节图像浮雕效果的角度和深度。
  用Photoshop实现图像浮雕效果,可以任意调节浮雕角度和深度(2个像素点的距离),还可以调整浮雕像素差值的数量。其基本算法原理和一般浮雕效果相同,但是具体做法不一样:对每个要处理的像素点,首先按照浮雕角度和深度计算处2个相应点的位置,然后计算这2个位置的颜色值,并使之形成差值,再乘上浮雕差值数量百分比,最后加上128的背景色。注意,这里计算的2个相应点是逻辑点,而不是实际的像素点,比如实现一个45度角,深度为3的图像浮雕效果,对每个像素点P(x, y),其对应的2个逻辑点的位置分别是P0(x - 3 * 0.7071 / 2, y - 3 * 0.7071 / 2)和P1(x 3 * 0.7071 / 2, y 3 * 0.7071 / 2),显然,对于这样的2个逻辑点,是不能直接从图像中找到其对应的像素点的,如果简单地对其四舍五入处理,将会造成大量的,由不同角度和深度而形成的相同的浮雕效果,这可不是我们想要的结果,而且使浮雕角度和深度参数失去了它原本的意义。为此,必须对原始图像按浮雕角度和深度进行缩放后,再对每个像素点进行浮雕效果处理,完毕再缩放回原图的大小,从而完成整个浮雕效果过程。下面是我经过反复试验后,写的Photoshop浮雕效果实现过程代码:
  数据类型:
  type
  // 与GDI TBitmapData结构兼容的图像数据结构
  TImageData = packed record
  Width: LongWord. // 图像宽度
  Height: LongWord. // 图像高度
  Stride: LongWord. // 图像扫描线字节长度
  PixelFormat: LongWord. // 未使用
  Scan0: Pointer. // 图像数据地址
  Reserved: LongWord. // 保留
  end.
  PImageData = ^TImageData.
  // 获取TBitmap图像的TImageData数据结构,便于处理TBitmap图像
  function GetImageData(Bmp: TBitmap): TImageData.
  begin
  Bmp.PixelFormat := pf32bit.
  Result.Width := Bmp.Width.
  Result.Height := Bmp.Height.
  Result.Scan0 := Bmp.ScanLine[Bmp.Height - 1].
  Result.Stride := Result.Width shl 2.
  // Result.Stride := (((32 * Bmp.Width) 31) and $ffffffe0) shr 3.
  end.
  过程代码:
  // 获取二次线性插值颜色
  function GetBoundColor(x, y: Integer. Source: TImageData): LongWord.
  asm
  push ebx
  push edx
  xor ebx, ebx // flag = 0
  test eax, eax
  jns @@1
  xor eax, eax // if (x <. 0)
  or ebx, 1 // {x = 0. flag = 1}
  jmp @@2
  @@1:
  cmp eax, [ecx]
  jl @@2
  mov eax, [ecx] // else if (x >.= Source.Width)
  dec eax // {x = Source.Width.Width - 1. flag = 1}
  or ebx, 1
  @@2:
  test edx, edx
  jns @@3
  xor edx, edx // if (y <. 0)
  or ebx, 1 // {y = 0. flag = 1}
  jmp @@5
  @@3:
  cmp edx, [ecx 4]
  jl @@5
  mov edx, [ecx 4] // else if (y >.= Source.Height)
  dec edx // {y = Source.Width.Height - 1. flag = 1}
  or ebx, 1
  @@5:
  shl eax, 2 // ARGBColor = *(ARGB*)(Source.Scan0
  imul edx, [ecx 8] // y * Source.Stride x * 4)
  add edx, eax
  mov eax, [ecx 16]
  add eax, edx
  mov eax, [eax]
  test ebx, 1
  jz @@6 // if (flag = 1)
  and eax, 0ffffffh // ARGBColor.a = 0
  @@6:
  pop edx
  pop ebx
  end.
  function GetBilinearColor(x, y: Integer. Source: TImageData): LongWord.
  var
  colors: array[0..4] of LongWord.
  m0, m1, m2, m3: LongWord.
  asm
  push ebx
  mov ebx, eax
  sar eax, 16
  push eax // x0 = x >.>. 16
  and ebx, 0ffffh
  shr ebx, 8 // u = (x &. 0xffff) >.>. 8
  mov eax, edx
  sar eax, 16
  push eax // y0 = y >.>. 16
  and edx, 0ffffh
  shr edx, 8 // v = (y &. 0xffff) >.>. 8
  mov eax, edx
  imul eax, ebx
  mov m3, eax // m3 = v * u
  mov eax, 255
  sub eax, edx

相关文章


计算机二级DELPHI技巧:编写通用的程序更新模块计算机二级考试
DELPHI技巧:InterBase使用方法总结计算机二级考试
DELPHI技巧:delphi图片换肤处理优化修正代码计算机二级考试
treeView中CheckBox如何设置子节点Check属性计算机二级考试
计算机二级DELPHI技巧:GDI 在Delphi程序的应用计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛