Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将海龟输出另存为jpeg_Python_Turtle Graphics - Fatal编程技术网

Python 将海龟输出另存为jpeg

Python 将海龟输出另存为jpeg,python,turtle-graphics,Python,Turtle Graphics,我有一个分形图像的创造者。它创建了一个随机的分形树。完成后,它会提示用户保存树。我现在就把它保存为.svg,这很有效,但我希望它保存为更方便的文件类型,比如jpeg。有什么想法吗? 代码: 导入海龟 随机输入 从系统导入退出 从时间输入时钟 进口拉票 海龟色模式(255) 红色=125 绿色=70 蓝色=38 钢笔=10 def saveImg(): 打印(“完成”) 保存=输入(“是否保存此树?是/否\N”) 如果save.upper()=“Y”: t、 希德图尔() name=input(“

我有一个分形图像的创造者。它创建了一个随机的分形树。完成后,它会提示用户保存树。我现在就把它保存为.svg,这很有效,但我希望它保存为更方便的文件类型,比如jpeg。有什么想法吗? 代码:

导入海龟
随机输入
从系统导入退出
从时间输入时钟
进口拉票
海龟色模式(255)
红色=125
绿色=70
蓝色=38
钢笔=10
def saveImg():
打印(“完成”)
保存=输入(“是否保存此树?是/否\N”)
如果save.upper()=“Y”:
t、 希德图尔()
name=input(“您想给它起什么名字?\n”)
nameSav=name+“.svg”
ts=turtle.getscreen().getcanvas()
canvasvg.saveall(nameSav,ts)
elif save.upper()=“N”:
def runChk():
再次运行=输入(“是否要再次运行?是/否(N将退出)”)
如果再次运行。upper()=“Y”:
打印(“运行”)
main()
elif runreach.upper()=“N”:
打印(“正在退出…”)
退出()
其他:
打印(“无效响应”)
runChk()
runChk()
其他:
打印(“无效响应”)
saveImg()
def树(小枝、t形、红色、绿色、蓝色、钢笔):
时间=str(全天候())
打印(“绘图…”+时间)
如果小枝>3:
笔=笔*0.8
t、 养老金(笔)
如果(红色>10,绿色<140):
红色=红色-15
绿色=绿色+8
如果小枝>5:
角度=随机。随机范围(18,55)
角度2=0.5*角度
sub=随机随机随机范围(1,16)
t、 颜色(红色、绿色、蓝色)
t、 前进(小枝)
t、 右(角二)
树(小枝亚,t,红色,绿色,蓝色,钢笔)
t、 左(角)
树(小枝亚,t,红色,绿色,蓝色,钢笔)
t、 右(角二)
t、 向后(小枝)
def main():
t=海龟。海龟()
myWin=turtle.Screen()
t、 速度(0)
t、 希德图尔()
t、 左(90)
t、 up()
t、 向后(100)
t、 向下()
打印(“请稍候,我正在绘制…”)
树(随机。随机范围(60,95),t,红色,绿色,蓝色,钢笔)
saveImg()
main()

它必须是JPEG格式吗?PNG够了吗

如果是这样,您可以使用将SVG转换为PNG。不幸的是,
canvasvg.saveall()
只允许您传递一个文件名,它将把SVG写入其中,因此您需要为SVG使用一个临时文件,然后使用
cairosvg.svg2png()
将该临时文件转换为PNG。所以像这样的东西应该可以完成这项工作:

import os
import shutil
import tempfile

import canvasvg

name = raw_input("What would you like to name it? \n")
nameSav = name + ".png"
tmpdir = tempfile.mkdtemp()  # create a temporary directory
tmpfile = os.path.join(tmpdir, 'tmp.svg')  # name of file to save SVG to
ts = turtle.getscreen().getcanvas()
canvasvg.saveall(tmpfile, ts)
with open(tmpfile) as svg_input, open(nameSav, 'wb') as png_output:
    cairosvg.svg2png(bytestring=svg_input.read(), write_to=png_output)
shutil.rmtree(tmpdir)  # clean up temp file(s)

如果愿意,您可以基于
canvasvg.saveall()
(它非常小)编写自己的
saveall()
函数,该函数接受类似文件的对象而不是文件名,并写入该对象。然后您可以传入一个
StringIO
对象,而不必处理临时文件。或者您的
saveall()
可以将SVG数据作为字节字符串返回。

啊,是的,png就可以了。我明天就试试这个。。。
tmp.svg
应该是nameSav还是tmp.svg是由os.path创建的文件?
tmp.svg
只是一个临时文件名。。你可以选择任何你喜欢的名字。由于临时文件是在临时目录中创建的(具有随机名称),因此您的文件将是唯一的,您不必担心名称冲突。我以前没有使用过os和临时文件,但该错误听起来好像tmpfile变量有问题。。。。它不是在创建那个目录吗?tempfile是否为文件命名,或者我们是否需要以某种方式对其应用nameSav?更新:刚刚在错误中转到该目录,tmp.svg就在那里,它确实是创建的最后一个图像。。。。Huhalright现在没有错误,除了canvas2svg警告:不支持“image”类型的项目。但是在我能看到的任何地方仍然没有png输出…您的应用程序没有权限在运行应用程序的任何目录(当前工作目录)中创建output.png文件。当您通过启动器直接运行python时,工作目录可能不同。要修复此问题,请通过
os.chdir()
更改脚本目录,在
open()
中包含目录的路径(例如
open(os.path.join(savedir,nameSav),'wb')
),或者让用户输入包含路径的文件名。
import os
import shutil
import tempfile

import canvasvg

name = raw_input("What would you like to name it? \n")
nameSav = name + ".png"
tmpdir = tempfile.mkdtemp()  # create a temporary directory
tmpfile = os.path.join(tmpdir, 'tmp.svg')  # name of file to save SVG to
ts = turtle.getscreen().getcanvas()
canvasvg.saveall(tmpfile, ts)
with open(tmpfile) as svg_input, open(nameSav, 'wb') as png_output:
    cairosvg.svg2png(bytestring=svg_input.read(), write_to=png_output)
shutil.rmtree(tmpdir)  # clean up temp file(s)