Ghostscript正在切断我对png的ps

2024-09-30 01:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

关于ghostscript和tkinter的问题:

我做了一个tkinter程序,我想把它转换成一幅图像;我希望图像的比例与纸上的8.5×12相同;我读到它是2550x3300像素。 如何将其转换为画布坐标?现在我选择了一些比例相似的数字,宽度=1275,高度=1650 另外,画布的尺寸和尺寸到底是多少?我以为这是我可以写的东西的长度,但是我可以设置滚动区域,甚至比给定的宽度和高度还要远。在

画布代码的基本思想:

class Application(tk.Frame):
    def __init__(self, master):
        self.master=master

        self.canvas = tk.Canvas(master, width=1275, height=1650, bg='white', highlightthickness=0,
                                scrollregion=(0, 0, 1275, 1650))
        self.hbar = Scrollbar(master, orient=HORIZONTAL)
        self.hbar.pack(side=TOP, fill=X)
        self.hbar.config(command=self.canvas.xview)
        self.vbar = Scrollbar(master, orient=VERTICAL)
        self.vbar.pack(side=RIGHT, fill=Y)
        self.vbar.config(command=self.canvas.yview)

        self.canvas.config(width=1275, height=1650)
        self.canvas.config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set)
        self.canvas.pack(side=LEFT, expand=True, fill=BOTH)


        B1=Button(master,text='add image',command= lambda:self.insert_image())
        B1.pack(side=TOP)

这是我的代码:

^{pr2}$

它似乎在左边和右边被切断了。 然后我添加了一些参数,比如-dFitPage“、”-g1275x1650“、“-dPSFitPage”,甚至是“-g2550x3300”而不是“-g1275x1650”,但这会产生不同的错误, 画布的顶部在保存的图像中间结束。我想要的是画布的顶部出现在图像的顶部。在

谢谢。在

Image of what my canvas looks like

how it saves


Tags: 图像selfmasterconfig宽度tkinter画布fill
1条回答
网友
1楼 · 发布于 2024-09-30 01:19:48

好的,首先,你引用的大小使用'-g',这是像素数。显然,实际的媒体大小将取决于分辨率。如果我声明大小为600x600,分辨率为600dpi,那么就是1英寸乘以1英寸,如果分辨率是300 dpi,那么它是2英寸x 2英寸。在

所以你不能说8.5x12英寸(这应该是标准介质尺寸之一吗?)是2550x3300像素,但没有说明分辨率。事实上,这甚至不可能是正确的。如果我假设3300对于12英寸的长度是正确的,那么它的分辨率是275 dpi。如果我算出它的宽度2550/275=9英寸。在

碰巧,png16m设备的默认分辨率似乎是72。所以2550×3300像素意味着你的媒体是35x45英寸。你有滚动条并不奇怪:-)

当然,您的PostScript程序可能会改变分辨率,但由于您没有提供它来查看,所以我无法判断。在

现在,Postscript坐标系统从左下角开始(默认情况下),即0,0,并向两个方向延伸,正数向上,负数向下和向左移动。是的,完全可以指定部分或全部绘图操作在介质之外进行。在

你也可以改变坐标系,但这可能比你想要的要复杂。在

如果没有看到你的PostScript程序,我真的说不出为什么它会部分脱离媒体,可能这就是程序的要求。在

使用FitPage将尝试将请求的图像调整到页面,如果太大,它将缩小(线性,两个方向相等),直到两个维度都适合媒体。这将导致在一个方向上出现空白,除非您的媒体恰好与程序要求的形状相同。这个最小的维度就是中心。我不太记得了,但我想如果这个节目的标志适合媒体,那么它就只是中心了。在

所以基本上,你首先需要得到正确的尺寸。假设您对72 dpi的输出图像满意,并且您的介质是真正的8.5x12英寸,那么您可以指定-g612x864。如果渲染的图像不能精确匹配,那么很可能是程序在媒体上做了标记,使用了不同的媒体大小,或“其他”。不看后记就说不出话来。在

如果你能分享一个简单的PostScript文件,我可以看看(对不起,我不能使用任何需要我使用tkinter的东西),并给你一些更详细的指导。在

[编辑]

所以输出实际上是一个EPS,而不是PostScript程序,我们可以从最初的注释中看到(任何以“%”开头的行都是注释):

%!PS-Adobe-3.0 EPSF-3.0
%%Creator: Tk Canvas Widget
%%Title: Window .49823304L
%%CreationDate: Mon Aug 14 23:47:27 2017
%%BoundingBox: -171 85 785 707

%!PS告诉我们它是一个PostScript程序,-Adobe-3.0告诉我们它符合文档结构约定的3.0版本(创建PostScript程序的一种方法,使它们更适合非PostScript解释器使用),而EPSF告诉我们它的实际上是一个EPS,最后,后面的-3.0声明它符合EPS规范的3.0版本。在

现在EPS文件不打算直接发送到PostScript解释器。它们应该包含在其他PostScript程序中,并作为一种“黑匣子”使用。这项技术经常被使用,当对象是某种东西,如一个公司的标志,不改变,或当你把工作发送给一个外部机构(如一个自由职业的平面艺术家),他们可能会发送它作为一个EPS供你使用。在

EPS符合某些关于它可以包含什么和不能包含什么的规则。设置媒体大小是它所不能做的重要事情之一。执行setpagedevice会导致设备重置标记的内容,这将丢弃在选择媒体之前所做的任何标记。在

此外,每股收益还不知道什么时候会有多大画在最后一页。你可以想象一个logo在首页被画得很大,然后在每个页面的页脚画得很小。在

所以EPS包含的是它标记页面的位置的声明,由BoundingBox给出:

^{pr2}$

现在您将注意到这个EPS的边界框从-179,85开始,延伸到785707。所以它的宽度是964,高度是792。这些是以PostScript5为单位的,即1/72英寸。所以你的每股收益实际上是13.38英寸宽12英寸高。不仅如此,它开始于离媒体左边缘2.48英寸的地方。在

这可能解释了为什么您在获取所需的输出时遇到困难,您可能没有在Ghostscript中正确设置媒体,并转换原点,以便左边缘不会离开媒体。在

应用程序的工作是将EPS放在它自己的PostScript输出中来转换和缩放坐标系,以便EPS在最终媒体上处于所需的位置和大小。在

因此,您可以选择;您可以创建一个PostScript程序,该程序适当地设置当前的转换矩阵,以缩放和定位EPS,然后将EPS完整地包含在其中,最后用一个showpage完成实际渲染(EPS文件可能由于明显的原因不包括showpage)

或者您可以在Ghostscript(文档化的here)中使用-depscop或EPSFitPage开关,这将使内容适合页面,或者页面适合内容。请注意,FitPage开关的精确行为取决于您所使用的Ghostscript的确切版本,您还没有提到。其中的文档是针对当前版本9.21的。在

如果您自己创建一个PostScript程序来完成这项工作,那么您就可以完全控制它的渲染方式;如果您让Ghostscript来完成它,那么您的控制就更少了,但是它很简单。你的选择真的。在

注:pastebin突然停止,没有实际的标记,因此它不是一个有效的PostScript程序。如果你把整个文件放在DropBox或soemthing上,我可能会说得更具体一些,但要点肯定会在上面介绍。在

相关问题 更多 >

    热门问题