如何做到BMP图象缩放时平滑过渡?

dageming 2006-09-26 05:01:09
类似CAD、GOOGLE EARTH的效果,哪个高手给说道说道
...全文
482 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Z_Magic 2007-01-16
  • 打赏
  • 举报
回复
//图像缩放过程,带插值运算(线性插值法)
//参数:矩形区域,源图像
//注意:此代码只支持24或32位色的情况(对于15或16位色需要按位拆开—因为不拆开的话
// 会在计算中出现不期望的进位或借位,导致图像颜色混乱—处理较麻烦;对于8位
// 及8位以下索引色需要查调色板,并且需要重索引,也很麻烦,所以都不支持;但
// 8位灰度图像可以支持)。另外代码中加入一些在图像边缘时防止访问越界的代码。
procedure StretchLinear(Dest, Src: TBitmap); // only for 24bit bitmap
var
sw, sh, dw, dh, B, N, x, y, i, j, k, nPixelSize: DWord;
pLinePrev, pLineNext, pDest, pA, pB, pC, pD: PByte;
begin
sw := Src.Width -1;
sh := Src.Height -1;
dw := Dest.Width -1;
dh := Dest.Height -1;
nPixelSize := 3; //GetPixelSize(Dest.PixelFormat)
for i := 0 to dh do begin
pDest := Dest.ScanLine[i];
y := i * sh div dh;
N := dh - i * sh mod dh;
pLinePrev := Src.ScanLine[y];
Inc(y);
if N = dh then begin
pLineNext := pLinePrev;
end else begin
pLineNext := Src.ScanLine[y];
end;
for j := 0 to dw do begin
x := j * sw div dw * nPixelSize;
B := dw - j * sw mod dw;
pA := pLinePrev;
Inc(pA, x);
pB := pA;
Inc(pB, nPixelSize);
pC := pLineNext;
Inc(pC, x);
pD := pC;
Inc(pD, nPixelSize);
if B = dw then begin
pB := pA;
pD := pC;
end;
for k := 0 to nPixelSize -1 do begin
pDest^ := Byte(DWord( (B * N * DWord(pA^ - pB^ - pC^ + pD^) + dw * N * pB^
+ dh * B * pC^ + (dw * dh - dh * B - dw * N)* pD^
+ dw * dh div 2) div (dw * dh) ));
Inc(pDest);
Inc(pA);
Inc(pB);
Inc(pC);
Inc(pD);
end;
end;
end;
end;
天涯倦客 2006-11-07
  • 打赏
  • 举报
回复
有 开源项目.. 去 sf查查 看
loujing 2006-11-04
  • 打赏
  • 举报
回复
同意楼上,选取好的插值算法。
e_feeling 2006-09-30
  • 打赏
  • 举报
回复
缩放使用插值算法,比如双线性插值,样条插值等等
GARNETT2183 2006-09-26
  • 打赏
  • 举报
回复
有一些平滑算法,可以让图片,看起来有些平滑...
dageming 2006-09-26
  • 打赏
  • 举报
回复
GoogleEarth在同一级别缩放也是相当平滑的,不知道怎么实现的,高手请继续说
postren 2006-09-26
  • 打赏
  • 举报
回复
1 CAD不是BMP图片,是一种矢量图
2 GoogleEarth是用了多级图片,不同的缩放级别显示不同的图片

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧