我有一个大的SVG文件(大约60 MB,10000x10000像素但有可能变大),我想要创建许多平铺的256x256 PNG图像(在这个例子中会有1600个图像) ;圆形(10000/256)^ 2).
有没有人知道如何在Web服务器上执行此操作(运行PHP等)?我想过rsvg,但它似乎没有任何功能来修改边界框(我宁愿避免为每个部分手动操作).ImageMagick也许可以做到,但我没有太多运气让它运转起来.使用rsvg创建一个大的PNG,然后使用专用于拼贴非常大的图像的工具可能会有效,但我没有运气找到这样的东西!速度并不是一个真正的问题,虽然它是可取的,所以如果最坏的情况发生,我可能会考虑修改SVG的每个部分的边界框.不过,我可以看到这一代人永远在走!
有谁知道这样做的任何方法?
编辑2016-03-02:
我最近再次回到需要这个问题的答案,并且Inkscape似乎是唯一能够以给定大小呈现特定区域的SVG的工具(svgexport几乎满足这些要求,但它不允许您更改宽高比) .
我的目标是将SVG平铺到256x256磁贴中,现在我已经成功制作了一个脚本,可以通过重复渲染inkscape大约16,000 x 16,000并平铺生成的图像来平铺任意大的SVG .我已成功渲染尺寸超过500,000 x 500,000像素的SVG - 内存使用没有问题(这需要很长时间!)
考虑以下测试用例,其中包含一个'factory'类,它可以调用它包含的闭包,提供一些'defaultaultable'类型的新实例:
protocol Defaultable {
init()
}
extension Int: Defaultable { }
extension Double: Defaultable { }
extension String: Defaultable { }
class Factory<T : Defaultable> {
let resultHandler: (T) -> ()
init(resultHandler: (T) -> ()) {
self.resultHandler = resultHandler
}
func callResultHandler() {
resultHandler(T.init())
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我单独使用它时,这很好用,我可以跟踪泛型类型:
// Create Int factory variant...
let integerFactory = Factory(resultHandler: { (i: Int) in print("The default integer is \(i)") })
// Call factory variant...
integerFactory.callResultHandler()
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我想以一种无法跟踪泛型类型的方式使用工厂,它就不能很好地工作:
// Create a queue of factories of some …Run Code Online (Sandbox Code Playgroud) 我注意到在使用带有字符串的C库const char *(它被转换为Swift as UnsafePointer<Int8>!)时出现了一些不寻常的行为; 通过String按预期工作,但String?似乎破坏了输入.考虑我写的测试:
func test(_ input: UnsafePointer<UInt8>?) {
if let string = input {
print(string[0], string[1], string[2], string[3], string[4], string[5])
} else {
print("nil")
}
}
let input: String = "Hello"
test(input)
Run Code Online (Sandbox Code Playgroud)
这按预期工作,为输入字符串打印以null结尾的UTF-8字节列表: 72 101 108 108 111 0
但是,如果我将输入更改为可选字符串,那么它将变为:
let input: String? = "Hello"
Run Code Online (Sandbox Code Playgroud)
我在result(176 39 78 23 1 0)中得到了一组完全不同的值,即使我希望它是相同的.传递nil按预期工作.
C库的函数允许NULL代替字符串,我有时也希望在Swift中传递它,因此输入字符串是可选的.
这是Swift中的一个错误,还是Swift没有设计来处理这种情况?无论哪种方式,处理这种情况的最佳方法是什么?
编辑
它似乎与多个参数有关.C函数:
void multiString(const char *arg0, const char *arg1, const char …Run Code Online (Sandbox Code Playgroud) 基本上,我想在一个立方体周围渲染一个轮廓。为此,我想我可以使用SCNTechnique具有以下渲染通道的 :
问题是,模板中的文档SCNTechnique非常稀少,我无法确切地知道如何使用它。
我已经通过首先在禁用深度测试的情况下绘制较大的“轮廓立方体”然后再绘制普通立方体来成功绘制轮廓,这效果很好,但是由于这种方法的其他复杂性,我想改用模板。
在尝试使用模板缓冲区使其工作时,我的第一遍stencilStates看起来像(以及我认为我需要这些属性的原因):
clear = YES // To clear the buffer from last
enable = YES // To write to the buffer
behavior:
writeMask = 1 // Use bit 1
function = always // Always write to stencil regardless?
Run Code Online (Sandbox Code Playgroud)
第二遍的stencilStates样子:
clear = NO // Keep the buffer from last step
enable = NO // Don't write to the buffer (only read?)
behavior:
readMask = 1 // Use bit …Run Code Online (Sandbox Code Playgroud) 我正在使用BEM,并且有一个包含多个修饰符的元素:
<div class="block__element block__element--m1 block__element--m2"></div>
Run Code Online (Sandbox Code Playgroud)
我正在使用SCSS并利用它来编写与BEM兼容的嵌套规则.如果我想编写一个规则,其中元素(如上所述)同时具有m1和m2修饰符,是否有一种方法可以编写与我当前编写它们的方式兼容的方法?这是我之后的语法,但会导致语法错误:
.block {
display: block;
&__element {
display: inline;
&--m1 {
background-color: red;
}
&--m2 {
background-color: green;
}
// Syntax error
&--m1&--m2 {
background-color: yellow;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过使用属性选择器来想办法,但有更简洁的方法吗?
对于记录,编译的属性选择器应该是:
.block__element--m1.block__element--m2
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的函数:
func test(closure: () -> ()) {
let localClosure = { closure() }
localClosure()
}
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,并没有完全反映我遇到的问题,显然在这里我可以closure直接调用!
应该清楚的是,在上面的代码中,closure无法逃避.但是,我收到错误:
关闭使用非转义参数'closure'可能允许它逃脱
现在,如果localClosure以某种方式逃避,我会理解这个错误,但它并没有逃脱.我甚至尝试注释localClosure为@noescape(尽管在Swift 3中该属性已被弃用),并且根据我得到的警告:
@noescape是默认值,不推荐使用
如果localClosure是,默认情况下,非转义,那么为什么不能再进入另一个非转义闭包呢?或者这是编译器的错误/限制?
如果前进的距离太大,则调用advancedBya String.CharacterView.Index将导致EXC_BAD_ACCESS.这可以在这里看到:
let inputString = "Hello, world!"
let index = inputString.startIndex
let distance = 100
let newIndex = index.advancedBy(distance) // fatal error: cannot increment endIndex
Run Code Online (Sandbox Code Playgroud)
现在,如果index已经从字符串中提前了startIndex一些未知的次数,并且distance是一些不安全的用户输入?如何验证按指定距离推进指数不会导致崩溃?
我注意到在某些情况下,我在Swift中的一个约束上设置isActive = false后,当我稍后尝试访问它时它是nil,但情况并非总是如此.在一种情况下,我有两个视图控制器,并且在viewWillAppear中的约束上都设置isActive为false,但是在一个视图中,约束稍后可用,我可以设置isActive = true而在另一个视图中它是nil.
什么会导致这种行为?我能够通过将优先级设置为1或900来绕过它,但它仍然留下了背景中真正发生的事情的问题.