baitang36 发表于 2024-6-11 17:12:44

用lisp转换图片格式 png2bmp

本帖最后由 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-filenamepath
      :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-applyIPr 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中的位置,读写二进制文件。
欢迎有兴趣的朋友一起玩。

baitang36 发表于 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,不可超过这个数的。

kozmosovia 发表于 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显示起来卡的要死。

baitang36 发表于 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

顶老哥,这个待下一步开发主要是作用大,。

hubeiwdlue 发表于 2024-6-11 20:46:35

谢谢盛老师的无私分享。

czb203 发表于 2024-6-11 22:35:10

谢谢盛老师的无私分享。:handshake

guosheyang 发表于 2024-6-11 23:25:20

感谢大佬的分享!

kozmosovia 发表于 2024-6-11 23:39:10

用处其实不大。也没啥应用场景。
页: [1] 2 3
查看完整版本: 用lisp转换图片格式 png2bmp