找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 11309|回复: 3

【VB】简单扩散抖动算法实例(附源码)(Floyd–Steinberg dithering Demo, download)

[复制链接]
发表于 2016-7-16 00:26:53 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
比起规则抖动,扩散抖动能避免产生规则抖动带来的规则斑点。原理是将像素的误差值扩散到邻近像素。

首先我们看看不经过抖动,只单纯降级为256色的图像,是下面这样的:(严重失真)
Downgrade.png

经过抖动之后,图像画面好多了。
floydsteinberg.png

算法的伪代码如下:
  1. for each y from top to bottom
  2.         for each x from left to right
  3.                 oldpixel  := pixel[x][y]
  4.                 newpixel  := find_closest_palette_color(oldpixel)
  5.                 pixel[x][y]  := newpixel
  6.                 quant_error  := oldpixel - newpixel
  7.                 pixel[x+1][y  ] := pixel[x+1][y  ] + quant_error * 7/16
  8.                 pixel[x-1][y+1] := pixel[x-1][y+1] + quant_error * 3/16
  9.                 pixel[x  ][y+1] := pixel[x  ][y+1] + quant_error * 5/16
  10.                 pixel[x+1][y+1] := pixel[x+1][y+1] + quant_error * 1/16
复制代码


说白了就是把误差值往右扩散7/16,往左下扩散3/16,往正下扩散5/16,再往右下扩散1/16。
我用VB实现了一个实例。关键代码:
  1. Private Sub cmdDither1_Click()
  2. Dim ThisPix As Color_t      '当前像素颜色值
  3. Dim NextPix As Color_t      '下一个像素的误差扩散值
  4. Dim Down3(2) As Color_t     '下一行三个像素的误差扩散值
  5. Dim LinePix() As Color_t    '计算好的一整行像素的误差扩散值
  6. Dim PixErr As Color_t       '误差

  7. Dim LU!, T!
  8. Dim X&, Y&, C&, I&

  9. '如果之前运行了算法,先将图片框中的图像恢复
  10. picSrc.Cls

  11. '处理图片数据
  12. ReDim LinePix(picSrc.ScaleWidth - 1)
  13. For Y = 0 To picSrc.ScaleHeight - 1
  14.     For X = 0 To picSrc.ScaleWidth - 1
  15.         C = picSrc.Point(X, Y) '取当前点颜色值
  16.         '颜色是用3个字节存储RGB通道的,将其拆开为3个Long
  17.         ThisPix.R = (C And &HFF&)
  18.         ThisPix.G = (C And &HFF00&) \ &H100
  19.         ThisPix.B = (C And &HFF0000) \ &H10000
  20.         
  21.         '计算新的颜色值
  22.         ThisPix.R = ThisPix.R + NextPix.R + LinePix(X).R
  23.         ThisPix.G = ThisPix.G + NextPix.G + LinePix(X).G
  24.         ThisPix.B = ThisPix.B + NextPix.B + LinePix(X).B
  25.         
  26.         '取得调色板最接近颜色值
  27.         I = GetNearestCol(ThisPix)
  28.         
  29.         '取得误差值
  30.         PixErr.R = ThisPix.R - Pal(I).R
  31.         PixErr.G = ThisPix.G - Pal(I).G
  32.         PixErr.B = ThisPix.B - Pal(I).B
  33.         
  34.         '向右扩散误差值
  35.         NextPix.R = PixErr.R * 7 \ 16
  36.         NextPix.G = PixErr.G * 7 \ 16
  37.         NextPix.B = PixErr.B * 7 \ 16
  38.         
  39.         '然后将误差值向下扩散
  40.         If X >= 1 Then LinePix(X - 1) = Down3(0)
  41.         Down3(0).R = Down3(1).R + PixErr.R * 3 \ 16
  42.         Down3(0).G = Down3(1).G + PixErr.G * 3 \ 16
  43.         Down3(0).B = Down3(1).B + PixErr.B * 3 \ 16
  44.         Down3(1).R = Down3(2).R + PixErr.R * 5 \ 16
  45.         Down3(1).G = Down3(2).G + PixErr.G * 5 \ 16
  46.         Down3(1).B = Down3(2).B + PixErr.B * 5 \ 16
  47.         Down3(2).R = PixErr.R * 1 \ 16
  48.         Down3(2).G = PixErr.G * 1 \ 16
  49.         Down3(2).B = PixErr.B * 1 \ 16
  50.         
  51.         '显示到图片框
  52.         picSrc.PSet (X, Y), RGB(Pal(I).R, Pal(I).G, Pal(I).B)
  53.     Next
  54.     LinePix(X - 1) = Down3(1)
  55.    
  56.     T = Timer
  57.     If T - LU > 0.1 Then
  58.         LU = T
  59.         If DoEvents = 0 Then Exit For
  60.     End If
  61. Next
  62. End Sub
复制代码
附件:Attachment(source code)
扩散抖动算法.rar (345.51 KB, 下载次数: 36, 售价: 1 个宅币)
名称: 扩散抖动算法.rar
大小: 353807 字节
SHA1: DBDDB08E0B09FCB57979FE75D53CD71DF69A33F8

参考资料:
https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

图片来源:
涼宮ハルヒの憂鬱 第08話 「笹の葉ラプソディ」
第12分09秒时的截图,图中的角色是朝比奈实玖瑠。

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2019-5-10 20:38:22 | 显示全部楼层
参考资料地址已经打不开了,收藏一下,这是通用的吗?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-5-11 09:59:22 | 显示全部楼层
Ink_Hin_fifteen 发表于 2019-5-10 20:38
参考资料地址已经打不开了,收藏一下,这是通用的吗?

参考资料我依然能打开,请学会科学上网。

另外,我不知道你说的通用是哪方面。
回复 赞! 靠!

使用道具 举报

发表于 2024-4-8 09:59:41 | 显示全部楼层
终于找到了,多谢分享 +++
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 17:33 , Processed in 0.037874 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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