递归火山软件开发平台
标题:
易语言的代码用火山怎么写?
[打印本页]
作者:
a649871230
时间:
3 天前
标题:
易语言的代码用火山怎么写?
.版本 2
.子程序 图片_取图片区域, 字节集, 公开, 提供一张图片,取出指定位置大小的图片。
.参数 原位图, 字节集, , 24位BMP位图
.参数 图片左边, 整数型, , 欲取出的图片左边
.参数 图片顶边, 整数型, , 欲取出的图片顶边
.参数 图片宽度, 整数型, , 欲取出的图片宽度
.参数 图片高度, 整数型, , 欲取出的图片高度
.局部变量 图像宽度, 整数型
.局部变量 图像高度, 整数型
.局部变量 图像位数, 整数型
.局部变量 图像压缩, 整数型
.局部变量 新位图, 字节集
.局部变量 新位图信息头, BITMAPINFOHEADER
.局部变量 新位图文件头, BITMAPFILEHEADER
.局部变量 文件长度, 整数型
.局部变量 i, 整数型
.局部变量 颜色点阵偏移量, 整数型
.局部变量 点的大小, 整数型
.局部变量 颜色表, 字节集
.局部变量 总数据偏移, 整数型
.局部变量 新行宽, 整数型
.局部变量 原行宽, 整数型
.局部变量 时间, 整数型
图像宽度 = 取字节集数据 (取字节集中间 (原位图, 19, 4), #整数型, )
图像高度 = 取字节集数据 (取字节集中间 (原位图, 23, 4), #整数型, )
图像位数 = 取字节集数据 (取字节集中间 (原位图, 29, 2), #短整数型, )
图像压缩 = 取字节集数据 (取字节集中间 (原位图, 31, 4), #整数型, )
.如果真 (图像压缩 ≠ 0)
返回 ({ })
.如果真结束
.如果真 (图像位数 = 32)
颜色点阵偏移量 = 54
点的大小 = 4
.如果真结束
.如果真 (图像位数 = 24)
颜色点阵偏移量 = 54
点的大小 = 3
.如果真结束
.如果真 (图像位数 = 16)
颜色点阵偏移量 = 54
点的大小 = 2
.如果真结束
.如果真 (图像位数 = 8)
颜色点阵偏移量 = 1078
点的大小 = 1
颜色表 = 取字节集中间 (原位图, 55, 1024)
.如果真结束
.如果真 (图像位数 < 8)
输出调试文本 (“错误! 图像位深小于8!”)
返回 ({ })
.如果真结束
'
'
.如果真 (图片左边 < 0)
图片左边 = 0
.如果真结束
.如果真 (图片顶边 < 0)
图片顶边 = 0
.如果真结束
.如果真 (图片左边 > 图像宽度 或 图片顶边 > 图像高度)
输出调试文本 (“参数错误,错误原因:图片左边或图片顶边小于截取出来图片的宽度或高度”)
返回 ({ })
.如果真结束
.如果真 (图片宽度 ≤ 0 或 图片高度 ≤ 0)
输出调试文本 (“参数错误,错误原因:图片宽度或图片高度小于等于0”)
返回 ({ })
.如果真结束
.如果真 (图片左边 + 图片宽度 > 图像宽度)
图片宽度 = 图像宽度 - 图片左边
.如果真结束
.如果真 (图片顶边 + 图片高度 > 图像高度)
图片高度 = 图像高度 - 图片顶边
.如果真结束
原行宽 = 左移 (右移 (图像宽度 × 图像位数 + 31, 5), 2)
新行宽 = 左移 (右移 (图片宽度 × 图像位数 + 31, 5), 2)
文件长度 = 新行宽 × 图片高度
新位图 = 取空白字节集 (文件长度 + 54 + 取字节集长度 (颜色表))
新位图文件头.bfType = 19778
新位图文件头.bfOffBits = 颜色点阵偏移量
新位图文件头.bfSize = 颜色点阵偏移量 + 文件长度
RtlMoveMemory_BITMAPFILEHEADER_字节型 (新位图 [1], 新位图文件头, 14)
新位图信息头.biSize = 40
新位图信息头.biWidth = 图片宽度
新位图信息头.biHeight = 图片高度
新位图信息头.biPlanes = 1
新位图信息头.biBitCount = 图像位数
RtlMoveMemory_BITMAPINFOHEADER (新位图 [15], 新位图信息头, 40)
.如果真 (图像位数 = 8)
RtlMoveMemory_字节型 (新位图 [55], 颜色表 [1], 1024)
.如果真结束
总数据偏移 = 原行宽 × (图像高度 - 图片高度 - 图片顶边) + 图片左边 × 点的大小 '
.计次循环首 (图片高度, i)
RtlMoveMemory_字节型 (新位图 [(i - 1) × 新行宽 + 颜色点阵偏移量 + 1], 原位图 [颜色点阵偏移量 + 总数据偏移 + (i - 1) × 原行宽 + 1], 新行宽)
.计次循环尾 ()
返回 (新位图)
.版本 2
.DLL命令 RtlMoveMemory_BITMAPFILEHEADER_字节型, , "kernel32.dll", "RtlMoveMemory", 公开
.参数 Dest, 字节型, 传址
.参数 Src, BITMAPFILEHEADER
.参数 len, 整数型
.DLL命令 RtlMoveMemory_BITMAPINFOHEADER, , "kernel32.dll", "RtlMoveMemory", 公开
.参数 Dest, 字节型, 传址
.参数 Src, BITMAPINFOHEADER
.参数 len, 整数型
.DLL命令 RtlMoveMemory_字节型, , "kernel32.dll", "RtlMoveMemory", 公开, 复制内存数据_MIB_IPFORWARDROW参数
.参数 Destination, 字节型, 传址, 目标地址
.参数 Source, 字节型, 传址, 要复制的数据MIB_IPFORWARDROW
.参数 Length, 整数型, , 长度
.版本 2
.数据类型 BITMAPINFOHEADER
.成员 biSize, 整数型
.成员 biWidth, 整数型
.成员 biHeight, 整数型
.成员 biPlanes, 短整数型
.成员 biBitCount, 短整数型
.成员 biCompression, 整数型
.成员 biSizeImage, 整数型
.成员 biXPelsPerMeter, 整数型
.成员 biYPelsPerMeter, 整数型
.成员 biClrUsed, 整数型
.成员 biClrImportant, 整数型
.数据类型 BITMAPFILEHEADER
.成员 bfType, 短整数型
.成员 bfSize, 整数型
.成员 bfReserved1, 短整数型
.成员 bfReserved2, 短整数型
.成员 bfOffBits, 整数型
这个代码用火山怎么写?
作者:
Xelloss0618
时间:
3 天前
<火山程序 类型 = "通常" 版本 = 1 />
类 LPBITMAPINFOHEADER <公开 基础类 = 本地结构指针模板 折叠 @别名 = "LPBITMAPINFOHEADER" @模板实现类 = "">
{
变量 biSize <公开 类型 = 整数 @输出名 = "biSize">
变量 biWidth <公开 类型 = 整数 @输出名 = "biWidth">
变量 biHeight <公开 类型 = 整数 @输出名 = "biHeight">
变量 biPlanes <公开 类型 = 短整数 @输出名 = "biPlanes">
变量 biBitCount <公开 类型 = 短整数 @输出名 = "biBitCount">
变量 biCompression <公开 类型 = 整数 @输出名 = "biCompression">
变量 biSizeImage <公开 类型 = 整数 @输出名 = "biSizeImage">
变量 biXPelsPerMeter <公开 类型 = 整数 @输出名 = "biXPelsPerMeter">
变量 biYPelsPerMeter <公开 类型 = 整数 @输出名 = "biYPelsPerMeter">
变量 biClrUsed <公开 类型 = 整数 @输出名 = "biClrUsed">
变量 biClrImportant <公开 类型 = 整数 @输出名 = "biClrImportant">
}
类 LPBITMAPFILEHEADER <公开 基础类 = 本地结构指针模板 折叠 @别名 = "LPBITMAPFILEHEADER" @模板实现类 = "">
{
变量 bfType <公开 类型 = 短整数 @输出名 = "bfType">
变量 bfSize <公开 类型 = 整数 @输出名 = "bfSize">
变量 bfReserved1 <公开 类型 = 短整数 @输出名 = "bfReserved1">
变量 bfReserved2 <公开 类型 = 短整数 @输出名 = "bfReserved2">
变量 bfOffBits <公开 类型 = 整数 @输出名 = "bfOffBits">
#
}
类 案例 <公开 折叠>
{
方法 图片_取图片区域 <公开 静态 类型 = 字节集类 注释 = "提供一张图片,取出指定位置大小的图片。">
参数 原位图 <类型 = 字节集类 注释 = "24位BMP位图">
参数 图片左边 <类型 = 整数 注释 = "欲取出的图片左边">
参数 图片顶边 <类型 = 整数 注释 = "欲取出的图片顶边">
参数 图片宽度 <类型 = 整数 注释 = "欲取出的图片宽度">
参数 图片高度 <类型 = 整数 注释 = "欲取出的图片高度">
{
变量 新位图 <类型 = 字节集类>
如果 (原位图.取字节集长度 () < LPBITMAPFILEHEADER.取数据尺寸 () + LPBITMAPINFOHEADER.取数据尺寸 ())
{
返回 (新位图)
}
变量 位图文件 <类型 = LPBITMAPFILEHEADER>
变量 位图信息 <类型 = LPBITMAPINFOHEADER>
位图文件 = LPBITMAPFILEHEADER.来自变整数 (原位图.取字节集指针 ())
位图信息 = LPBITMAPINFOHEADER.来自变整数 (原位图.取字节集指针 () + LPBITMAPFILEHEADER.取数据尺寸 ())
如果 (位图文件.bfSize != (无符号整数)原位图.取字节集长度 () || 位图信息.biCompression != 0)
{
返回 (新位图)
}
变量 颜色表 <类型 = 字节集类>
变量 颜色点阵偏移量 <类型 = 整数>
变量 点的大小 <类型 = 整数>
如果 (位图信息.biBitCount == 32)
{
颜色点阵偏移量 = 位图文件.bfOffBits
点的大小 = 4
}
否则 (位图信息.biBitCount == 24)
{
颜色点阵偏移量 = 位图文件.bfOffBits
点的大小 = 3
}
否则 (位图信息.biBitCount == 16)
{
颜色点阵偏移量 = 位图文件.bfOffBits
点的大小 = 2
}
否则 (位图信息.biBitCount == 8)
{
颜色点阵偏移量 = 1078
点的大小 = 1
颜色表 = 原位图.取字节集中间 (位图文件.bfOffBits, 1024)
}
否则
{
调试输出 ("错误! 图像位深小于8!")
返回 (新位图)
}
如果 (图片左边 < 0)
{
图片左边 = 0
}
如果 (图片顶边 < 0)
{
图片顶边 = 0
}
如果 (图片左边 > 位图信息.biWidth || 图片顶边 > 位图信息.biHeight)
{
调试输出 ("参数错误,错误原因:图片左边或图片顶边小于截取出来图片的宽度或高度")
返回 (新位图)
}
如果 (图片宽度 <= 0 || 图片高度 <= 0)
{
调试输出 ("参数错误,错误原因:图片左边或图片顶边小于截取出来图片的宽度或高度")
}
如果 (图片左边 + 图片宽度 > 位图信息.biWidth)
{
图片宽度 = 位图信息.biWidth - 图片左边
}
如果 (图片顶边 + 图片高度 > 位图信息.biHeight)
{
图片高度 = 位图信息.biHeight - 图片顶边
}
变量 新行宽 <类型 = 整数>
变量 原行宽 <类型 = 整数>
变量 文件长度 <类型 = 整数>
原行宽 = 位左移 (位右移 (位图信息.biWidth * 位图信息.biBitCount + 31, 5), 2)
新行宽 = 位左移 (位右移 (图片宽度 * 位图信息.biBitCount + 31, 5), 2)
文件长度 = 新行宽 * 图片高度
新位图.分配字节集 (文件长度 + LPBITMAPFILEHEADER.取数据尺寸 () + LPBITMAPINFOHEADER.取数据尺寸 () + 颜色表.取字节集长度 (), 真)
变量 新位图文件 <类型 = LPBITMAPFILEHEADER>
新位图文件 = LPBITMAPFILEHEADER.来自变整数 (新位图.取字节集指针 ())
新位图文件.bfType = 位图文件.bfType
新位图文件.bfOffBits = 颜色点阵偏移量
新位图文件.bfSize = 颜色点阵偏移量 + 文件长度
变量 新位图信息 <类型 = LPBITMAPINFOHEADER>
新位图信息 = LPBITMAPINFOHEADER.来自变整数 (新位图.取字节集指针 () + LPBITMAPFILEHEADER.取数据尺寸 ())
内存复制 (新位图信息.取变整数指针 (), 位图信息.取变整数指针 (), LPBITMAPINFOHEADER.取数据尺寸 ())
新位图信息.biWidth = 图片宽度
新位图信息.biHeight = 图片高度
如果 (新位图信息.biBitCount == 8)
{
内存复制 (新位图.取字节集指针 () + 54, 颜色表.取字节集指针 (), 颜色表.取字节集长度 ())
}
变量 总数据偏移 <类型 = 整数>
总数据偏移 = 原行宽 * (位图信息.biHeight - 图片高度 - 图片顶边) + 图片左边 * 点的大小
计次循环 (图片高度)
{
内存复制 (新位图.取字节集指针 () + 取循环索引 () * 新行宽 + 颜色点阵偏移量, 原位图.取字节集指针 () + 颜色点阵偏移量 + 总数据偏移 + 取循环索引 () * 原行宽, 新行宽)
}
返回 (新位图)
}
}
复制代码
作者:
a649871230
时间:
前天 02:07
Xelloss0618 发表于 2025-3-22 12:21
谢谢大哥!
欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/)
Powered by Discuz! X3.4