急求 如下代码如何修改可以锐化jpg图片

xuyanjiao1800 2008-01-03 01:47:16
急求~用此代码锐话jpg图片 图片会消失 不知问题在那

procedure TForm1.N3Click(Sender: TObject);
var
bmp1, bmp2: Tbitmap;
p1, p2, p3, p4: pbytearray;
//定义四个pbytearray类型变量
i, j, z: integer;
y: array[0..8] of integer;
begin
y[0] := 0; y[1] := -1; y[2] := 0;
y[3] := -1; y[4] := 5; y[5] := -1;
y[6] := 0; y[7] := -1; y[8] := 0;
//卷积矩阵
z := 1;
//卷积核
bmp1 := Tbitmap.Create;//创建目标位图
bmp2 := Tbitmap.Create;//创建备份位图
bmp1.Assign(image1.Picture.Bitmap);// 加载目标位图
bmp1.PixelFormat := pf24bit;
//24为格式便于处理
bmp1.Width := image1.Picture.Graphic.Width;
bmp1.Height := image1.Picture.Graphic.Height;//设置目标位图大小
bmp2.Assign(bmp1);
//备用的位图
bmp2.PixelFormat := pf24bit;//备用位图也是24位
for j := 1 to bmp1.Height - 2 do
begin
p1 := bmp1.ScanLine[j];
//第一条扫描线
p2 := bmp2.ScanLine[j - 1];
//第二条扫描线,为了防止数据变化,在备用位图上操作
p3 := bmp2.ScanLine[j];
p4 := bmp2.ScanLine[j + 1];
//第三条扫描线
//三条相邻的扫描线
for i := 1 to bmp1.Width - 2 do
begin
//进行卷积操作获取新的象素值
p1[3 * i + 2] := min(255, max(0, ((y[0] * p2[3 * (i - 1) + 2]
+ y[1] * p2[3 * i + 2] + y[2] * p2[3 * (i + 1) + 2]
+ y[3] * p3[3* (i - 1)+ 2] + y[4] * p3[3 * i + 2]
+ y[5] * p3[3 * (i + 1) + 2] + y[6] * p4[3 * (i - 1) + 2]
+ y[5] * p4[3 * i + 2] + y[8] * p4[3 * (i + 1) + 2]))
div
z));
//重新算出红色分量
p1[3 * i + 1] := min(255, max(0, ((y[0] * p2[3 * (i - 1) + 1]
+ y[1] * p2[3 * i + 1] + y[2] * p2[3 * (i + 1) + 1]
+ y[3] * p3[3 * (i - 1) + 1] + y[4] * p3[3 * i + 1]
+ y[5] * p3[3 * (i + 1) + 1] + y[6] * p4[3 * (i - 1) + 1]
+ y[5] * p4[3 * i + 1] + y[8] * p4[3 * (i + 1) + 1]))
div
z));
//重新算出蓝色分量
p1[3 * i] := min(255, max(0, ((y[0] * p2[3 * (i - 1)] + y[1] * p2[3 * i]
+ y[2] * p2[3 * (i + 1)] + y[3] * p3[3 * (i - 1)] + y[4] * p3[3 * i]
+ y[5] * p3[3 * (i + 1)] + y[6] * p4[3 * (i - 1)] + y[5] * p4[3 * i]
+ y[8] * p4[3 * (i + 1)]))
div
z));
//重新算出绿色分量
end;
end;
Image1.Picture.Bitmap.Assign(Bmp1);
//重新显示
Image1.Invalidate;
Bmp1.Free;
bmp2.Free;
//释放资源
end;
...全文
124 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuyanjiao1800 2008-01-04
  • 打赏
  • 举报
回复
谢谢
aleader_jzb 2008-01-03
  • 打赏
  • 举报
回复
bmp1.Assign(image1.Picture.Bitmap);// 加载目标位图
上面的改为:
bmp1.Assign(image1.Picture.Graphic);// 加载目标位图
  • 打赏
  • 举报
回复
因为你装入到image中的可能不是bitmap,可能是icon、metafile、jpeg、gif等等,
这种情况下bitmap是空的,没有数据,宽高都是0,怎么能得到结果呢?
Graphic是一个图形格式的抽象,它不实现任何具体的格式。
任何具体的图形格式,只要是从TGraphic继承或者从TGraphic的子类继承下来的,就在TGraphic层次上具有兼容性。比如只要这种格式实现了对其他格式的Assign和AssignTo方法,就可以互相转换。
一般来说,几乎所有格式都能支持AssignTo TBitmap。
这种设计的巧妙之处在于TGraphic(以及使用它的容器,象TImage、TPicture)不需要做任何修改就可以支持新的图形格式。
xuyanjiao1800 2008-01-03
  • 打赏
  • 举报
回复
procedure TForm1.N3Click(Sender: TObject);
var
bmp1, bmp2: Tbitmap;
p1, p2, p3, p4: pbytearray;
//定义四个pbytearray类型变量
i, j, z: integer;
y: array[0..8] of integer;
begin
y[0] := 0; y[1] := -1; y[2] := 0;
y[3] := -1; y[4] := 5; y[5] := -1;
y[6] := 0; y[7] := -1; y[8] := 0;
//卷积矩阵
z := 1;
//卷积核
bmp1 := Tbitmap.Create;//创建目标位图
bmp2 := Tbitmap.Create;//创建备份位图
bmp1.Assign(image1.Picture.Graphic);// 加载目标位图 用.Graphic不用Bitmap
bmp1.PixelFormat := pf24bit;
//24为格式便于处理
bmp1.Width := image1.Picture.Graphic.Width;
bmp1.Height := image1.Picture.Graphic.Height;//设置目标位图大小
bmp2.Assign(bmp1);
//备用的位图
bmp2.PixelFormat := pf24bit;//备用位图也是24位

我将 Bitmap 改为 Graphic 加载到Graphic字段就可以了 这是怎么回事呢?Graphic字段谁能给我详细讲讲么 谢谢
xuyanjiao1800 2008-01-03
  • 打赏
  • 举报
回复
请问如何修改呢 这个问题困扰我很久了 这算我一个测试任务 我找遍了都找不到关于 jpg 的锐化

请您帮帮我吧~
  • 打赏
  • 举报
回复
bmp1.Assign(image1.Picture.Graphic); // 因为你装入到image中的可能不是bitmap,很可能是jpeg

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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