标题:vfp9报表保存为高分辨率图片
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 30楼 radiofan
用GDI+ api 创建图形句柄,封装ReportListener重载OutputPage,在OutputPage里面处理生成图片文件,这样应该可以改变图片的分辨率。
试试写个简单示例参考
2019-08-02 13:54
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
以下是引用吹水佬在2019-8-2 13:54:05的发言:

用GDI+ api 创建图形句柄,封装ReportListener重载OutputPage,在OutputPage里面处理生成图片文件,这样应该可以改变图片的分辨率。
试试写个简单示例参考


期待你的示例! 拜托!
2019-08-02 14:56
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 32楼 radiofan
简单试了一下:

*** test.prg ***
CLEAR
#DEFIN PixelFormat32bppARGB  0x26200A
DECLARE LONG GdipCreateBitmapFromScan0 IN gdiplus.dll LONG, LONG, LONG, LONG, STRING@, LONG@
DECLARE LONG GdipGetImageGraphicsContext IN gdiplus LONG, LONG@
DECLARE LONG GdipSaveImageToFile IN gdiplus LONG, STRING@, STRING@, LONG
DECLARE LONG GdipDisposeImage IN gdiplus LONG
DECLARE LONG GdipDeleteGraphics IN gdiplus LONG
CREATE CURSOR tt (ss C(10), ff I)
FOR i = 1 TO 50
    INSERT INTO tt VALUES (PADL(i, 10, "0"), i)
ENDFOR
oRL = CREATEOBJECT("myReportListener")
REPORT FORM 报表扩展功能示例.frx OBJECT oRL
RETURN

DEFINE CLASS myReportListener as ReportListener
    ListenerType = 2
    PROCEDURE OutputPage(nPageNo, eDevice, nDeviceType,;
            nleft, nTop, nWidth, nHeight, ;
            nClipLeft, nClipTop, nClipWidth, nClipHeight)
        LOCAL nWidth, nHeight, hBitmap, hGraphics, cFile, bmpGUID
        nWidth = this.GetPageWidth()/2
        nHeight = this.GetPageHeight()/2    && 分辨率太大图片好象有点不正常,情况不明。
        ? "分辨率:"+TRANSFORM(nWidth)+"*"+TRANSFORM(nHeight)
        hBitmap = 0
        GdipCreateBitmapFromScan0(nWidth, nHeight, 0, PixelFormat32bppARGB, 0, @hBitmap)
        IF hBitmap == 0
            ? "创建Bitmap失败"
            RETURN
        ENDIF
        hGraphics = 0
        GdipGetImageGraphicsContext(hBitmap, @hGraphics)
        IF hGraphics == 0
            GdipDisposeImage(hBitmap)
            ? "获取Graphics失败"
            RETURN
        ENDIF
        DODEFAULT(nPageNo, hGraphics, 1, 0,0,nWidth,nHeight, 0,0,nWidth,nHeight)
        **cFile = "C:\temp\kkkk" + PADL(nPageNo,LEN(TRANSFORM(this.PageTotal)),"0") + ".bmp"
        cFile = "C:\temp\kkkk" + PADL(nPageNo,6,"0") + ".bmp"
        bmpGUID = 0h00F47C55041AD3119A730000F81EF32E
        GdipSaveImageToFile(hBitmap, STRCONV(cFile+0h00,5), @bmpGUID, 0)
        GdipDisposeImage(hBitmap)
        GdipDeleteGraphics(hGraphics)
    ENDPROC
ENDDEFINE

[此贴子已经被作者于2019-8-2 16:47编辑过]

2019-08-02 15:03
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
非常感谢版主的辛勤付出!

测试后正是我要的结果,研究中 ……  以下是page/2的效果,很满意!



[此贴子已经被作者于2019-8-2 15:45编辑过]

2019-08-02 15:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 33楼 吹水佬
cFile = "C:\temp\kkkk" + PADL(nPageNo,LEN(TRANSFORM(this.PageTotal)),"0") + ".bmp"
这句的 this.PageTotal 有问题,要遍扫描所有页面后才可得到。
或取足够大的数:
cFile = "C:\temp\kkkk" + PADL(nPageNo,6,"0") + ".bmp"
2019-08-02 16:37
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
以下是引用吹水佬在2019-8-2 16:37:17的发言:

cFile = "C:\temp\kkkk" + PADL(nPageNo,LEN(TRANSFORM(this.PageTotal)),"0") + ".bmp"
这句的 this.PageTotal 有问题,要遍扫描所有页面后才可得到。
或取足够大的数:
cFile = "C:\temp\kkkk" + PADL(nPageNo,6,"0") + ".bmp"


只要报表页中有涉及到pagetotal,好像报表就会运行两次得到pagetotal值。

如果ListenerType = 3,一次输出所有页,是否会快点?

我测试改成png格式,page/4的效果已经非常好了,得到的文件也就几百K,非常不错!

很感谢版主的热情相助!
2019-08-02 17:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 36楼 radiofan
先扫描一遍就可以,改几个地方:
1、增加一个nPageCount属性
    nPageCount = 0
2、输出文件名改为
    cFile = "C:\temp\kkkk" + PADL(nPageNo,LEN(TRANSFORM(this.nPageCount)),"0") + ".bmp"
3、打印过程:
    oRL = CREATEOBJECT("myReportListener")
    oRL.ListenerType = -1
    REPORT FORM 报表扩展功能示例(旋转).frx OBJECT oRL
    oRL.nPageCount = oRL.PageTotal
    oRL.ListenerType = 2
    REPORT FORM 报表扩展功能示例(旋转).frx OBJECT oRL
2019-08-02 18:01
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
回复 37楼 吹水佬
谢谢,够用了,很好!我的报表页不多,一般也就几页。
目地达到,可以不用word和excel了…也可以不用安装虚拟打印机了!

周一再做优化!祝周末愉快!
辛苦了,再次感谢!
2019-08-02 21:54
radiofan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:466
专家分:696
注 册:2006-7-30
得分:0 
回复 37楼 吹水佬
修改了下,效果不错!周末愉快!

程序代码:
*** test.prg ***
CLEAR
#DEFIN PixelFormat32bppARGB  0x26200A
DECLARE LONG GdipCreateBitmapFromScan0 IN gdiplus.dll LONG, LONG, LONG, LONG, STRING@, LONG@
DECLARE LONG GdipGetImageGraphicsContext IN gdiplus.dll LONG, LONG@
DECLARE LONG GdipSaveImageToFile IN gdiplus.dll LONG, STRING@, STRING@, LONG
DECLARE LONG GdipDisposeImage IN gdiplus.dll LONG
DECLARE LONG GdipDeleteGraphics IN gdiplus.dll LONG

oRL = CREATEOBJECT("ReportListener")
oRL.ListenerType = 3
REPORT FORM ? OBJECT oRL

for aa = 1 to oRL.PageTotal
        LOCAL nWidth, nHeight, hBitmap, hGraphics, cFile, bmpGUID
        nWidth =  oRL.GetPageWidth()/4
        nHeight = oRL.GetPageHeight()/4   && 分辨率太大图片好象有点不正常,情况不明。
        hBitmap = 0
        GdipCreateBitmapFromScan0(nWidth, nHeight, 0, PixelFormat32bppARGB, 0, @hBitmap)
        IF hBitmap == 0
            ? "创建Bitmap失败"
            RETURN
        ENDIF
        hGraphics = 0
        GdipGetImageGraphicsContext(hBitmap, @hGraphics)
        IF hGraphics == 0
            GdipDisposeImage(hBitmap)
            ? "获取Graphics失败"
            RETURN
        ENDIF
        oRL.OutputPage(aa, hGraphics, 1, 0,0,nWidth,nHeight, 0,0,nWidth,nHeight)
        cFile = "D:\temp\kkkk" + alltrim(str(aa)) + ".png"
        bmpGUID = 0h06F47C55041AD3119A730000F81EF32E
        GdipSaveImageToFile(hBitmap, STRCONV(cFile+0h00,5),@bmpGUID,0)
        GdipDisposeImage(hBitmap)
        GdipDeleteGraphics(hGraphics)
endfor 
2019-08-03 07:43
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
学习啦,谢谢分享!谢谢各位大师!
2019-08-03 09:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-496118-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048787 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved