明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1883|回复: 22

[源码] 用lisp转换图片格式 png2bmp

[复制链接]
发表于 2024-6-11 17:12:44 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2024-6-12 05:42 编辑

;把png文件转化为bmp文件;baitang36 2024-6-11 JN ;感谢高飞鸟大侠的大力支持
(vl-load-com)
(defun GetSpecialPath (n / fso path)
  (setq fso  (vlax-create-object "Scripting.FileSystemObject"))
  (setq path (vlax-get (vlax-invoke fso 'GetSpecialFolder n) 'path))
  (vlax-release-object fso)
  path
)
(defun png2bmp( source target  / path Img IPr vec cnt col old val fil i new)
  (setq path (strcat (getSpecialPath 1) "\\wiaaut.dll"))
  (if (not ic-actionEvent)
    (vlax-import-type-library
      :tlb-filename  path
      :methods-prefix "im-"
      :properties-prefix "ip-"
      :constants-prefix "ic-"
    )
  )
  (setq Img (vlax-create-object "WIA.ImageFile"))
  (setq IPr  (vlax-create-object "WIA.ImageProcess"))
  (im-loadfile Img source)       ;"c:\\00\\1.png"
  ;(setq kuan(vlax-get-property img "Width"))
; (setq gao(vlax-get-property img "Height"))
; (princ kuan)(princ "*")(princ gao)(princ"\n")
  (setq fil (ip-get-Filters IPr))
  (im-add fil (ip-get-filterID (ip-get-item (ip-get-filterinfos IPr) "Convert")) 0)
  (ip-put-value (ip-get-item (ip-get-Properties (ip-get-item fil 1)) "FormatID")   "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}")
  (setq new (im-apply  IPr Img))
  (im-savefile new target )          ;("c:\\00\\2.bmp")

  (vlax-release-object Img)
  (vlax-release-object IPr)
  (vlax-release-object fil)
  (vlax-release-object new)
  (princ)
)
;用法:(PNG2BMP "c:/00/1.png" "c:/00/1.bmp")


我的想法是这样的:
1.直接从dwg中挖出png缩略图
2.png2bmp
3.bmp2sld
4.实现dcl直接预览dwg
这种做法比命令行mslide要快的多,特别是dwg文件非常大的时候
第一步和第三步是难点,第一步需要研究png在dwg中的位置,读写二进制文件。
欢迎有兴趣的朋友一起玩。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 收起 理由
USER2128 + 1 赞一个!
tomonkey239 + 1 赞一个!
自贡黄明儒 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-6-12 11:18:40 | 显示全部楼层
本帖最后由 baitang36 于 2024-6-13 06:34 编辑
kozmosovia 发表于 2024-6-12 10:57
1:缩略图可以直接导出为BMP的,不需要PNG作为媒介。
2:BMP到SLD属于点阵到矢量,有图形到矢量的转换能 ...

acad2018及以后版本的dwg缩略图是png格式的,低版本的cad是bmp,更低版本的(如autoCAD10.0版)缩略图直接就是sld。有的版本的dwg没有缩略图。
bmp到sld确实是点阵到矢量的转换,只要做好水平线和竖直线的矢量化就行,斜线显示本来就是锯齿形的,用点描出来效果也可以接受。
dwg缩略图的尺寸都很小的,不超过256*256,png文件的大小不超过64k,sld达到几兆的可能性是不存在的。256*256的点阵每个点用8个字节表示是512k,不可超过这个数的。
发表于 2024-6-12 10:57:00 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-6-12 11:00 编辑
baitang36 发表于 2024-6-12 05:40
我的想法是这样的:
1.直接从dwg中挖出png缩略图
2.png2bmp

1:缩略图可以直接导出为BMP的,不需要PNG作为媒介。
2:BMP到SLD属于点阵到矢量,有图形到矢量的转换能力的程序也不多见。同时,以DWG缩略图的点阵精度,矢量转出来大概率也是惨不忍睹。
3:整体上还不如直接WMFOUT,WMFIN成为图块,读取图块内元素图形在Image显示来的更加顺畅。
4:DWX支持直接在Image范围内填充BMP图形,速度比BMP转SLD快的多:直接CAD内黏贴BMP,放大到图片区域MSLIDE生成的SLD文件动辄10几M,Image显示起来卡的要死。
 楼主| 发表于 2024-6-12 05:40:06 | 显示全部楼层
kozmosovia 发表于 2024-6-11 23:39
用处其实不大。也没啥应用场景。

我的想法是这样的:
1.直接从dwg中挖出png缩略图
2.png2bmp
3.bmp2sld
4.实现dcl直接预览dwg
这种做法比命令行mslide要快的多,特别是dwg文件非常大的时候
第一步和第三步是难点,第一步需要研究png在dwg中的位置,读写二进制文件。
           
发表于 2024-6-11 17:21:51 | 显示全部楼层
这个不错,查了一下,WIA能干的事情还有很多
发表于 2024-6-11 18:19:10 | 显示全部楼层
陨落 发表于 2024-6-11 17:21
这个不错,查了一下,WIA能干的事情还有很多

还能做什么??
发表于 2024-6-11 19:30:42 来自手机 | 显示全部楼层
陨落 发表于 2024-6-11 17:21
这个不错,查了一下,WIA能干的事情还有很多

给大家科谱一下呀!
发表于 2024-6-11 19:30:53 | 显示全部楼层
顶老哥,这个待下一步开发主要是作用大,。
发表于 2024-6-11 20:46:35 | 显示全部楼层
谢谢盛老师的无私分享。
发表于 2024-6-11 22:35:10 | 显示全部楼层
谢谢盛老师的无私分享。
发表于 2024-6-11 23:25:20 | 显示全部楼层
感谢大佬的分享!
发表于 2024-6-11 23:39:10 | 显示全部楼层
用处其实不大。也没啥应用场景。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 16:23 , Processed in 0.201494 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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