如果在位图上画出小数个象素的颜色 ( 积分: 200 )

  • 主题发起人 主题发起人 amerex
  • 开始时间 开始时间
A

amerex

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要表达一幅图像,在位图上画几个条子,这个条子的宽度就是小数,而且要求条子间的间隔一样,所以有时就会碰到下一个条子起始点位置可能是小数的情况。不能取整,否则会出现细密不均的现象
 
我需要表达一幅图像,在位图上画几个条子,这个条子的宽度就是小数,而且要求条子间的间隔一样,所以有时就会碰到下一个条子起始点位置可能是小数的情况。不能取整,否则会出现细密不均的现象
 
条子宽度放大10倍或者100倍取整,否则没办法,你见过半个活人么
 
如果放大10倍,条子的宽度可以取整了。不过能保证,条子之间的间隔肯定为整数吗,也不一定的。比如图片宽度是100个象素,条子的宽度是8个象素,我要画10个条子,条子就占去80个象素,也就是说间隔要平分剩下的20个象素,这20个象素要分给7个间隔,这样间隔就出现了小数,你说怎么办?如果我放大的话,我要显示一比一的效果的话,我还要缩小才行。
 
究竟是什么用途,仅仅是显示,还是其他什么的?
 
我觉得你考虑问题的方式有点奇怪,你为什么不倒过来想呢,首先像素点不可能出现
半个,所以就要考虑如何让图片宽度来适应这个现实,还有,屏幕的分辨率就那么大
96DPI,或者120DPI,更高的精度也不现实,你怎么能有1比1的阿
 
唉,楼主还是先弄清位图中像素的含义吧;如果你要显示得更平滑,那就多放大一些。
 
模拟的转成数字数字的就有失真的情况。必须要在出现小数的地方四舍五入。你无限的放大你的曲线就无限的接近真实值,直到你放大到总也不存在小数为止,如果总有小数就是放大无穷倍
 
当然我只要达到视觉效果,看上去分布均匀就可以了。我要通过什么算法才能计算出要画的颜色呢
 
主要达到视觉效果 , 那就好办, 下载 cnPack , 参考里面的代码. 可以用 浮点数 处理,

我在这里贴点给你参考:
procedure DrawLineF(x1, y1, x2, y2: Single; Color: TColor);
{* 以指定颜色绘制一条直线,使用抗锯齿算法
|<BR>
|<BR> x1, y1: Single  起始点坐标
|<BR> x2, y2: Single  结束点坐标
|<BR> Color: TColor  直线颜色}

procedure TCnBitmap.DrawLineF(X1, Y1, X2, Y2: Single; Color: TColor);
var
n, i: Integer;
px, py, ex, ey, nx, ny, hyp: Integer;
ARGB: TCnColor;
begin
if not ClipLineF(x1, y1, x2, y2, 0, Width - 1, 0, Height - 1) then Exit;
Changing;
ARGB := CnColor(Color);
px := Round(x1 * $8000);
py := Round(y1 * $8000);
ex := Round(x2 * $8000);
ey := Round(y2 * $8000);
nx := ex - px; // 宽度
ny := ey - py; // 高度
if (nx = 0) or (ny = 0) then
hyp := Round(Hypot(nx, ny))
else
case FPenWeight of // 斜边长
pwThin: hyp := Round(Hypot(nx, ny));
pwNormal: hyp := Round(Hypot(nx, ny) * 1.4); // 粗细修正
pwThick: hyp := Round(Hypot(nx, ny) * 1.8);
else hyp := Round(Hypot(nx, ny));
end;

if hyp < 256 then Exit;
n := hyp shr 15;
if n > 0 then
begin
nx := Round(nx / hyp * $8000);
ny := Round(ny / hyp * $8000);
for i := 0 to n - 1 do
begin
DoSetPixelF(px, py, ARGB); // 绘制点
px := px + nx;
py := py + ny;
end;
DoSetPixelF(ex, ey, ARGB); // 绘制端点
end;
Changed;
end;
 
多人接受答案了。
 
后退
顶部