问个小问题,有没有办法获取当前打印机画布上的图像?

时间:2022-01-15 03:06:32
RT 。。。
之前往打印机上打印了图片,现在需要再往上画另一张图片,由于要作混算处理(类似于PS的正片叠底功能),所以要获取打印机上的图像(某个区域),再作计算(我不知道打印机上打印了些什么),但是使用bitblt等函数均无法拷贝到 printer.canvas.handle上的东西,出来的是一片白的,不知道有没有办法取得它的画布上的图像???

51 个解决方案

#1


都米人了?

#2


已经发过去了吧

#3


引用 2 楼 lhylhy 的回复:
已经发过去了吧

我试过这样 printer.canvas.draw();然后立即拷贝,结果也是空的,而且我还没有enddoc呢

#4


那你为什么不换个思路,先把2张图片换算好,在发打印机呢

#5


引用 4 楼 zhzhrony 的回复:
那你为什么不换个思路,先把2张图片换算好,在发打印机呢

我要是知道谁往上面打了什么,也不用这么绕圈子了

#6


引用 5 楼 mdejtod 的回复:
引用 4 楼 zhzhrony 的回复:
那你为什么不换个思路,先把2张图片换算好,在发打印机呢

我要是知道谁往上面打了什么,也不用这么绕圈子了


不明白你这问题? 你是想在已经打好的一张图片的纸上在重新打上一张图片上去?

如果不是,那人家发向打印机的数据,为什么不在之前算好再一起发?如果你无法得到对方打印前的数据,那对方已经发向打印机了,这时候打印忙,你怎么连接打印机获得该数据?

#7


那人家发向打印机的数据,为什么不在之前算好再一起发?
晕,都说了,要是能这么做,难道我不会????
先别考虑先后的问题。你自己试一下,
任何情况下把printer.canvas上的内容拷贝出来保存到一张图片上看看能不能取到图像?

#8


引用 7 楼 mdejtod 的回复:
那人家发向打印机的数据,为什么不在之前算好再一起发?
晕,都说了,要是能这么做,难道我不会????
先别考虑先后的问题。你自己试一下,
任何情况下把printer.canvas上的内容拷贝出来保存到一张图片上看看能不能取到图像?


其实我是不明白你为什么要实现这个功能,感觉很奇怪,就多了嘴,上面就当我没有回帖
对于你的问题我想问的是,既然打印机已经在打印了,你怎么能连接上,连不上你怎么能获得的数据

#9


....
打印没所谓连不连上的概念,你要打印只需尽管往打印机上发送打印命令
就算你在同一过程里写上如下函数,一样无法获取
printer.begindoc;
printer.canvas.draw(0,0,bmp);
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
这样,dstdc上并没有任何图像

#10


引用 9 楼 mdejtod 的回复:
....
打印没所谓连不连上的概念,你要打印只需尽管往打印机上发送打印命令
就算你在同一过程里写上如下函数,一样无法获取
printer.begindoc;
printer.canvas.draw(0,0,bmp);
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
这样……


打印机正在忙着打印,怎么有空返回数据给你?既然没有返回就说明打印机忙你不能进行连接以获得数据,也可能是我水平不够,期待牛人出现

#11


楼主是想监控目标打印机所打印的任何内容,并显示在画布上是吗?

#12


1 楼主想如何?解释清楚

#13


不太清楚

#14


不太清楚,顶下

#15


有道理啊,我也要知道答案!

#16


It is fine!

#17


顶顶顶

#18


LZ你可以把问题描述得更清楚些的
从你的发言中猜测,你是想在某台打印机打出内容之前,把这内容截取再作处理,而且并不知道是哪个程序或者哪台机子打的,所以没办法先处理再打对吧?这可能得考虑一下驱动了

#19


uiuyiuy

#20


不清楚,顶下。

#21


ding yi xia~~~~~~~~~~~~~

#22


不清楚,顶下。

#23


引用 18 楼 alifriend 的回复:
LZ你可以把问题描述得更清楚些的
从你的发言中猜测,你是想在某台打印机打出内容之前,把这内容截取再作处理,而且并不知道是哪个程序或者哪台机子打的,所以没办法先处理再打对吧?这可能得考虑一下驱动了

你说对了,就是我的程序里,也知道是哪个打印机,就好比我上面贴出来的简单代码一样
printer.begindoc;
printer.canvas.draw(0,0,bmp);
//在这之前,是另外一段类似的打印图片的代码,我接着去拷贝DC,但是拷贝不到任何内容
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
因为其它接口只提供了这个DC给我,所以,我没办法在打印前作混合处理!!!!

#24


这个不太好办,如果别人没留给你接口,只能用变通的方法
1.用虚拟打印机获取输出内容,处理后,再发送给真正的打印机
2.HOOK原程序,在输出打印前注入自己的代码,再跳转回来

#25


学习学习,顶下。

#26


除了这两个办法,没其它可行的办法了么?
其实我觉得不管是虚拟打印机,或者是HOOK的办法,关键还是在于如何获取打印机的内容?

#27


传向打印机的内容,打印机一接收就要处理,没有空理你的请求,所以用楼上的办法是最好.否则可以在中间加个服务器,只有服务器连接打印机就可以

#28


不太清楚

#29


引用 27 楼 zhzhrony 的回复:
传向打印机的内容,打印机一接收就要处理,没有空理你的请求,所以用楼上的办法是最好.否则可以在中间加个服务器,只有服务器连接打印机就可以


加个服务器

#30


路过,学习

#31


学习~~~~~~~~~~~~

#32


引用 11 楼 idwb 的回复:
楼主是想监控目标打印机所打印的任何内容,并显示在画布上是吗?

好像是这个意思,监视打印做相应的处理

#33


我只是用过tinypdf 挺好用的

#34


楼主看看这个帖子,
http://topic.csdn.net/t/20030925/10/2297775.html

#35


截个屏,再打印就是了呗

#36


可以参考下C++的处理方法: http://www.cppblog.com/rawdata   打印部分

记得给分哦~

#37


你可以參考一個 Open Source project, PDFCreator。

這個軟件做的比你還複雜,可以把印到硬表機的文件轉成 .PDF。

不過我猜你不會去參考,這個軟體對你而言,太深了。

#38


路边,学习学习

#39


打印机是没法当做U盘来用的,有些东东是只读的

#40


说错了,只能写不能读

#41


我最近也在忙林改的材料,学习下~~~

#42


等待最好的回答。

#43


谢谢各位回复。其实考虑得过于复杂了,可以不用这样处理,由于我的源图片是24位,带黑白和灰度的一个指纹图片,往打印机的画布上画时,只需要使用bitblt 函数,用'或'的方式画上去就可自动透明,

汗一个。搞了这么久,刚刚装了打印机。测试了一下才知道。。。。

#44


呵呵,学习了

#45


支持下,顺便得十分

#46


很不错啊。。

#47


嗯嗯 来学习学习

#48


我也要知道答案!谢谢了

#49


各位来晚啦,已经没分了,答案就是
bitmap 是24位的,只要这行代码就可以使白色部分透明的打到打印机上
bitblt(printer.canvas.handle,dx,dy,dw,dh,bitmap.canvas.handle,0,0, SRCAND);

#50


顶顶 下 以后用得着哦

#1


都米人了?

#2


已经发过去了吧

#3


引用 2 楼 lhylhy 的回复:
已经发过去了吧

我试过这样 printer.canvas.draw();然后立即拷贝,结果也是空的,而且我还没有enddoc呢

#4


那你为什么不换个思路,先把2张图片换算好,在发打印机呢

#5


引用 4 楼 zhzhrony 的回复:
那你为什么不换个思路,先把2张图片换算好,在发打印机呢

我要是知道谁往上面打了什么,也不用这么绕圈子了

#6


引用 5 楼 mdejtod 的回复:
引用 4 楼 zhzhrony 的回复:
那你为什么不换个思路,先把2张图片换算好,在发打印机呢

我要是知道谁往上面打了什么,也不用这么绕圈子了


不明白你这问题? 你是想在已经打好的一张图片的纸上在重新打上一张图片上去?

如果不是,那人家发向打印机的数据,为什么不在之前算好再一起发?如果你无法得到对方打印前的数据,那对方已经发向打印机了,这时候打印忙,你怎么连接打印机获得该数据?

#7


那人家发向打印机的数据,为什么不在之前算好再一起发?
晕,都说了,要是能这么做,难道我不会????
先别考虑先后的问题。你自己试一下,
任何情况下把printer.canvas上的内容拷贝出来保存到一张图片上看看能不能取到图像?

#8


引用 7 楼 mdejtod 的回复:
那人家发向打印机的数据,为什么不在之前算好再一起发?
晕,都说了,要是能这么做,难道我不会????
先别考虑先后的问题。你自己试一下,
任何情况下把printer.canvas上的内容拷贝出来保存到一张图片上看看能不能取到图像?


其实我是不明白你为什么要实现这个功能,感觉很奇怪,就多了嘴,上面就当我没有回帖
对于你的问题我想问的是,既然打印机已经在打印了,你怎么能连接上,连不上你怎么能获得的数据

#9


....
打印没所谓连不连上的概念,你要打印只需尽管往打印机上发送打印命令
就算你在同一过程里写上如下函数,一样无法获取
printer.begindoc;
printer.canvas.draw(0,0,bmp);
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
这样,dstdc上并没有任何图像

#10


引用 9 楼 mdejtod 的回复:
....
打印没所谓连不连上的概念,你要打印只需尽管往打印机上发送打印命令
就算你在同一过程里写上如下函数,一样无法获取
printer.begindoc;
printer.canvas.draw(0,0,bmp);
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
这样……


打印机正在忙着打印,怎么有空返回数据给你?既然没有返回就说明打印机忙你不能进行连接以获得数据,也可能是我水平不够,期待牛人出现

#11


楼主是想监控目标打印机所打印的任何内容,并显示在画布上是吗?

#12


1 楼主想如何?解释清楚

#13


不太清楚

#14


不太清楚,顶下

#15


有道理啊,我也要知道答案!

#16


It is fine!

#17


顶顶顶

#18


LZ你可以把问题描述得更清楚些的
从你的发言中猜测,你是想在某台打印机打出内容之前,把这内容截取再作处理,而且并不知道是哪个程序或者哪台机子打的,所以没办法先处理再打对吧?这可能得考虑一下驱动了

#19


uiuyiuy

#20


不清楚,顶下。

#21


ding yi xia~~~~~~~~~~~~~

#22


不清楚,顶下。

#23


引用 18 楼 alifriend 的回复:
LZ你可以把问题描述得更清楚些的
从你的发言中猜测,你是想在某台打印机打出内容之前,把这内容截取再作处理,而且并不知道是哪个程序或者哪台机子打的,所以没办法先处理再打对吧?这可能得考虑一下驱动了

你说对了,就是我的程序里,也知道是哪个打印机,就好比我上面贴出来的简单代码一样
printer.begindoc;
printer.canvas.draw(0,0,bmp);
//在这之前,是另外一段类似的打印图片的代码,我接着去拷贝DC,但是拷贝不到任何内容
bitblt(dstDc,0,0,width,height,printer.canvas.handle,0,0,srccopy);
printer.enddoc;
因为其它接口只提供了这个DC给我,所以,我没办法在打印前作混合处理!!!!

#24


这个不太好办,如果别人没留给你接口,只能用变通的方法
1.用虚拟打印机获取输出内容,处理后,再发送给真正的打印机
2.HOOK原程序,在输出打印前注入自己的代码,再跳转回来

#25


学习学习,顶下。

#26


除了这两个办法,没其它可行的办法了么?
其实我觉得不管是虚拟打印机,或者是HOOK的办法,关键还是在于如何获取打印机的内容?

#27


传向打印机的内容,打印机一接收就要处理,没有空理你的请求,所以用楼上的办法是最好.否则可以在中间加个服务器,只有服务器连接打印机就可以

#28


不太清楚

#29


引用 27 楼 zhzhrony 的回复:
传向打印机的内容,打印机一接收就要处理,没有空理你的请求,所以用楼上的办法是最好.否则可以在中间加个服务器,只有服务器连接打印机就可以


加个服务器

#30


路过,学习

#31


学习~~~~~~~~~~~~

#32


引用 11 楼 idwb 的回复:
楼主是想监控目标打印机所打印的任何内容,并显示在画布上是吗?

好像是这个意思,监视打印做相应的处理

#33


我只是用过tinypdf 挺好用的

#34


楼主看看这个帖子,
http://topic.csdn.net/t/20030925/10/2297775.html

#35


截个屏,再打印就是了呗

#36


可以参考下C++的处理方法: http://www.cppblog.com/rawdata   打印部分

记得给分哦~

#37


你可以參考一個 Open Source project, PDFCreator。

這個軟件做的比你還複雜,可以把印到硬表機的文件轉成 .PDF。

不過我猜你不會去參考,這個軟體對你而言,太深了。

#38


路边,学习学习

#39


打印机是没法当做U盘来用的,有些东东是只读的

#40


说错了,只能写不能读

#41


我最近也在忙林改的材料,学习下~~~

#42


等待最好的回答。

#43


谢谢各位回复。其实考虑得过于复杂了,可以不用这样处理,由于我的源图片是24位,带黑白和灰度的一个指纹图片,往打印机的画布上画时,只需要使用bitblt 函数,用'或'的方式画上去就可自动透明,

汗一个。搞了这么久,刚刚装了打印机。测试了一下才知道。。。。

#44


呵呵,学习了

#45


支持下,顺便得十分

#46


很不错啊。。

#47


嗯嗯 来学习学习

#48


我也要知道答案!谢谢了

#49


各位来晚啦,已经没分了,答案就是
bitmap 是24位的,只要这行代码就可以使白色部分透明的打到打印机上
bitblt(printer.canvas.handle,dx,dy,dw,dh,bitmap.canvas.handle,0,0, SRCAND);

#50


顶顶 下 以后用得着哦