chen_lady
黎晓琛
2015-06-26 07:10
采纳率: 100%
浏览 3.3k
已采纳

VB GetDIBits 方法读取图像像素问题

GetDIBits(Picture1.hdc, Picture1.Picture.Handle, 0&, iHeight, bits(0, 0, 0), bi24BitInfo, 0&)
就是用DIB方法获取图片像素坐标很困乱,就横坐标很混乱,纵坐标没问题,得到的颜色点坐标左边都不是从0开始的 例如:

(5,8) (6,8) (7,8) (8,8) (0,8) (1,8) (2,8) (3,8) (4,8)
(6,7) (7,7) (8,7) (0,7) (1,7) (2,7) (3,7) (4,7) (5,7)
(7,6) (8,6) (0,6) (1,6) (2,6) (3,6) (4,6) (5,6) (6,6)
(8,5) (0,5) (1,5) (2,5) (3,5) (4,5) (5,5) (6,5) (7,5)
(0,4) (1,4) (2,4) (3,4) (4,4) (5,4) (6,4) (7,4) (8,4)
(1,3) (2,3) (3,3) (4,3) (5,3) (6,3) (7,3) (8,3) (0,3)
(2,2) (3,2) (4,2) (5,2) (6,2) (7,2) (8,2) (0,2) (1,2)
(3,1) (4,1) (5,1) (6,1) (7,1) (8,1) (0,1) (1,1) (2,1)
(4,0) (5,0) (6,0) (7,0) (8,0) (0,0) (1,0) (2,0) (3,0)
要怎么把它的横坐标0点从左边开始呢?怎么对齐?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • chen_lady
    黎晓琛 2015-06-29 06:02
    已采纳

    终于调试好了,原来是我的宽没跟数组对齐

    点赞 评论
  • caozhy

    横坐标如果是连续的话,可以+宽度-偏移量再取模。
    比如
    (3,1)这个,宽度是9,偏移量(最左边的)是3,那么就是(3+9-3)Mod 9=0
    (4,1) (4+9-3) Mod 9=1
    ...
    这样它们就从0开始编号了。

    点赞 评论
  • chen_lady
    黎晓琛 2015-06-26 07:22

    请问你有没有做过类似的DIB方法读图像的,我这只是在猜测它图像是这样的,实际我也不知道它是怎么排的,我不知道它第一个点到底偏移了多少,也谢谢你的回答

    点赞 评论
  • fsj43
    倾心软件 2019-06-29 17:07

    你这篇文章对我启发很大,经过两天的不断测试,我终于用下面的公式将VB GetDIBits 方法取出的坐标,转化为VB与图像位置相对应的标准坐标
    转化代码如下:
    注意 bits为 GetDIBits 取到的坐标
    Dim vbArray()
    ReDim vbArray(1, w, h)

    For i = 0 To w
    For j = 0 To h
    vbArray(0, ((i + w - 3) Mod w + j) Mod w, h - j) = bits(0, i, j)
    Next j
    Next

    比你那个多出一步,每行加一个1 然后再求模,否则会出现图片每经过一行,错一位的问题,不知是怎么原理。

    点赞 评论

相关推荐