VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 965|回复: 7

帮忙看看呀,图像处理问题

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-7 18:40:01 | 显示全部楼层 |阅读模式
请问下面程序想实现在左边图片框中鼠标单击任一点蓝色区域实现在右边图片框把与刚才点选的那一点相连续的所有点变成绿色,为什么会出现“实时错误28,堆栈空间溢出”的错误呢?谢谢各位了。代码如下:

VERSION 5.00
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   6285
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   9000
   LinkTopic       =   "Form1"
   ScaleHeight     =   6285
   ScaleWidth      =   9000
   StartUpPosition =   3  '窗口缺省
   WindowState     =   2  'Maximized
   Begin VB.PictureBox pic2
      AutoRedraw      =   -1  'True
      AutoSize        =   -1  'True
      Height          =   2295
      Left            =   5640
      ScaleHeight     =   149
      ScaleMode       =   3  'Pixel
      ScaleWidth      =   173
      TabIndex        =   1
      Top             =   120
      Width           =   2655
   End
   Begin VB.PictureBox pic1
      AutoRedraw      =   -1  'True
      AutoSize        =   -1  'True
      Height          =   4830
      Left            =   120
      Picture         =   "Form1.frx":0000
      ScaleHeight     =   318
      ScaleMode       =   3  'Pixel
      ScaleWidth      =   356
      TabIndex        =   0
      Top             =   120
      Width           =   5400
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Type BITMAP '14 bytes
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long

Dim picBits() As Byte
Dim picInfoD As BITMAP '调入处理后图像所用的信息
Dim BytesperPixel As Integer

'get bitmap info
Private Function GetBI(pic As PictureBox, picBits() As Byte)
    Dim i As Long
   
    With pic
        GetObject .Image, Len(picInfoD), picInfoD
        BytesperPixel = picInfoD.bmBitsPixel \ 8
        ReDim picBits(1 To picInfoD.bmWidth * picInfoD.bmHeight * BytesperPixel)
        
        GetBitmapBits .Image, UBound(picBits), picBits(1)
    End With
End Function

'在图像上反选与点击的点连续的图像
Private Function SSMO(x As Single, y As Single, c As Integer)
    'On Error Resume Next
   
    If picBits((y * picInfoD.bmWidth + x) * BytesperPixel + c) = 255 Then
        picBits((y * picInfoD.bmWidth + x) * BytesperPixel + c) = 0
        picBits((y * picInfoD.bmWidth + x) * BytesperPixel + 3 - c) = 255
        DoEvents
        If picBits(((y - 1) * picInfoD.bmWidth + x - 1) * BytesperPixel + c) = 255 Then
            SSMO x - 1, y - 1, c
        End If
        If picBits(((y - 1) * picInfoD.bmWidth + x) * BytesperPixel + c) = 255 Then
            SSMO x, y - 1, c
        End If
        If picBits(((y - 1) * picInfoD.bmWidth + x + 1) * BytesperPixel + c) = 255 Then
            SSMO x + 1, y - 1, c
        End If
        If picBits((y * picInfoD.bmWidth + x - 1) * BytesperPixel + c) = 255 Then
            SSMO x - 1, y, c
        End If
        If picBits((y * picInfoD.bmWidth + x + 1) * BytesperPixel + c) = 255 Then
            SSMO x + 1, y, c
        End If
        If picBits(((y + 1) * picInfoD.bmWidth + x - 1) * BytesperPixel + c) = 255 Then
            SSMO x - 1, y + 1, c
        End If
        If picBits(((y + 1) * picInfoD.bmWidth + x) * BytesperPixel + c) = 255 Then
            SSMO x, y + 1, c
        End If
        If picBits(((y + 1) * picInfoD.bmWidth + x + 1) * BytesperPixel + c) = 255 Then
            SSMO x + 1, y + 1, c
        End If
    End If
    Exit Function
End Function

Private Sub Form_Load()
    pic2.Width = pic1.Width
    pic2.Height = pic1.Height
    GetBI pic1, picBits()
End Sub

Private Sub pic1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    SSMO x, y, 1
    SetBitmapBits pic2.Image, UBound(picBits), picBits(1)
End Sub
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-16 11:00:01 | 显示全部楼层
你首先要检查出错代码,然后结合上下文分析一下变量的值,或者自己在代码中添加一下msgbox语句显示出变量的值,堆栈出错一般是由于你的变量用得太多或变量类型太小出现的问题,可以定义变量为Long或Double类型试试
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-16 11:15:01 | 显示全部楼层
还有要注意有些时候VB中用的单位与象素不一样,是缇,1象素=15缇
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-8-16 12:45:02 | 显示全部楼层
找到出错地方,然后对症下药。
回复

使用道具 举报

0

主题

16

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-28 15:00:01 | 显示全部楼层
这个简单啊,网上搜一下就得到答案了.
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-2 14:15:02 | 显示全部楼层
gdi32是你自己写的吗
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-2 14:30:02 | 显示全部楼层
不懂,帮顶
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-2 14:45:01 | 显示全部楼层
不懂,帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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