C# 中的 GIMP 过滤器
GIMP Filter in C#
我整天都在尝试获取此代码 运行,但没有机会。我想对图像执行 GIMP 过滤器,然后将其保存到特定路径。使用此代码:
string choosenFile = "D:\here\is\the\image";
string gimpFile = "D:\here\is\my\gimp exe";
void seamlessFilter() {
try {
if (!string.IsNullOrEmpty(choosenFile)) {
string a = @"-b ""(script-fu-tile \"""
+ choosenFile
+ "100 100 0 TRUE 70"
+ @")"" -b ""(gimp-quit 0)""";
string result = ExecuteCommandSync(a);
Texture2D newTex = loadImage (new Vector2(200, 200), Path.GetFullPath(choosenFile));
newTex = null;
} else {
UnityEngine.Debug.Log("Please select a image");
}
} catch (Exception ex){
UnityEngine.Debug.Log (ex.ToString ());
}
}
public string ExecuteCommandSync(string command) {
ProcessStartInfo processStartInfo = new ProcessStartInfo (gimpFile, command);
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
Process process = new Process ();
process.StartInfo = processStartInfo;
process.Start ();
StreamReader reader = process.StandardOutput;
string result = reader.ReadToEnd ();
Console.WriteLine (result);
return result;
}
我尝试执行过滤器,但每次都出现错误,无法读取字符串。
这是.scm:
`
(define (script-fu-tile img
drawable
blend-x
blend-y
overlap
square)
(let*
(
(sel-float1 0)
(sel-float2 0)
(sel-float3 0)
(sel-float4 0)
(high-pass-layer 0)
(yoffset 0)
(img-w (/ (car (gimp-image-width img)) 2))
(img-h (/ (car (gimp-image-height img)) 2))
;(newimg (car (gimp-image-new (- (car (gimp-image-width img)) blend-x)
(- (car (gimp-image-height img)) blend-y) RGB)))
)
(if (= square 1)
(set! yoffset (+ (- (* (- img-w img-h) 2) (- blend-x blend-y)) overlap))
(set! yoffset overlap)
)
(gimp-undo-push-group-start img)
(gimp-rect-select img 0 0 img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float1 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float1)
(gimp-layer-translate sel-float1 (- (- img-w blend-x) yoffset) (- (- img-h blend-y) overlap))
(gimp-rect-select img img-w 0 img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float2 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float2)
(gimp-layer-translate sel-float2 (- 0 img-w) (- (- img-h blend-y) overlap))
(gimp-rect-select img 0 img-h img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float3 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float3)
(gimp-layer-translate sel-float3 (- (- img-w blend-x) yoffset) (- 0 img-h))
(gimp-rect-select img img-w img-h img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float4 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float4)
(gimp-layer-translate sel-float4 (- 0 img-w) (- 0 img-h))
(gimp-rect-select img (- 0 blend-x) (- 0 blend-x) (+ img-w (/ blend-x 2)) (+ img-h (+ blend-x blend-x)) CHANNEL-OP-REPLACE TRUE (/ blend-x 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float4)
(gimp-rect-select img (- 0 blend-y) (- 0 blend-y) (+ img-w (+ blend-y blend-y)) (+ img-h (/ blend-y 2)) CHANNEL-OP-REPLACE TRUE (/ blend-y 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float4)
(gimp-rect-select img (- (- img-w (- blend-x blend-y)) yoffset) (- 0 blend-y) (+ img-w (+ blend-y blend-y)) (+ img-h (/ blend-y 2)) CHANNEL-OP-REPLACE TRUE (/ blend-y 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float3)
(gimp-rect-select img (- 0 blend-x) (- (- img-h (+ blend-x blend-y)) overlap) (+ img-w (/ blend-x 2)) (+ img-h (+ blend-x blend-x)) CHANNEL-OP-REPLACE TRUE (/ blend-x 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float2)
(gimp-selection-none img)
;(gimp-layer-delete drawable)
(gimp-image-crop img (- (- (* img-w 2) blend-x) yoffset) (- (- (* img-h 2) blend-y) overlap) 0 0)
; Complete the undo group
(gimp-undo-push-group-end img)
; Flush output
(gimp-displays-flush)
)
)
(script-fu-register "script-fu-tile"
"<Image>/Filters/Map/Tileable..."
"Make seamless texture"
"Pavel aka RPG Roshchin <rpg89@post.ru>"
"Pavel aka RPG Roshchin"
"2011"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer to blur" 0
SF-ADJUSTMENT "Blend x" '(100 0 1000 1 10 0 0)
SF-ADJUSTMENT "Blend y" '(100 0 1000 1 10 0 0)
SF-ADJUSTMENT "Overlap" '(0 0 1000 1 10 0 0)
SF-TOGGLE
"Make square texture" TRUE
;SF-ADJUSTMENT "Homogenize brightness (%)" '(70 0 100 1 10 0 0)
)`
如果有人能提供帮助,我会很高兴,因为我很绝望。谢谢!
也许去看看here试试这个方法
但是从外观上看你的:
string a = @"-b ""(script-fu-tile \"""
+ choosenFile
+ "100 100 0 TRUE 70"
+ @")"" -b ""(gimp-quit 0)""";
应该看起来更像这样:
string a = @"gimp-2.6.exe -i -b ""(script-fu-tile \""" +
choosenFile + @"\""0 100 100 0 TRUE 70)"" -b ""(gimp-quit 0)""";
或本质上:
string draw = "0";
string blendx = "100";
string blendy = "100";
string overlap = "0";
string sqrText = "TRUE";
string adjBright = "70";
string a = @"gimp-2.6.exe -i -b ""(simple-unsharp-mask \""" +
path + @"\"" " + draw + " " + blendx + " " + blendy + " " + overlap + " "+ sqrText + " " + adjBright +
@")"" -b ""(gimp-quit 0)""";
从错误信息来看,您提供的代码中的上述字符串存在问题。试试那几个,然后给我评论。
我自己弄明白了 - 问题是,第一个参数 img 需要一个对象,但我写了一个字符串作为第一个参数。所以我编辑了我的 scm 脚本以将对象包装为字符串并且效果很好。
我整天都在尝试获取此代码 运行,但没有机会。我想对图像执行 GIMP 过滤器,然后将其保存到特定路径。使用此代码:
string choosenFile = "D:\here\is\the\image";
string gimpFile = "D:\here\is\my\gimp exe";
void seamlessFilter() {
try {
if (!string.IsNullOrEmpty(choosenFile)) {
string a = @"-b ""(script-fu-tile \"""
+ choosenFile
+ "100 100 0 TRUE 70"
+ @")"" -b ""(gimp-quit 0)""";
string result = ExecuteCommandSync(a);
Texture2D newTex = loadImage (new Vector2(200, 200), Path.GetFullPath(choosenFile));
newTex = null;
} else {
UnityEngine.Debug.Log("Please select a image");
}
} catch (Exception ex){
UnityEngine.Debug.Log (ex.ToString ());
}
}
public string ExecuteCommandSync(string command) {
ProcessStartInfo processStartInfo = new ProcessStartInfo (gimpFile, command);
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
Process process = new Process ();
process.StartInfo = processStartInfo;
process.Start ();
StreamReader reader = process.StandardOutput;
string result = reader.ReadToEnd ();
Console.WriteLine (result);
return result;
}
我尝试执行过滤器,但每次都出现错误,无法读取字符串。 这是.scm:
`
(define (script-fu-tile img
drawable
blend-x
blend-y
overlap
square)
(let*
(
(sel-float1 0)
(sel-float2 0)
(sel-float3 0)
(sel-float4 0)
(high-pass-layer 0)
(yoffset 0)
(img-w (/ (car (gimp-image-width img)) 2))
(img-h (/ (car (gimp-image-height img)) 2))
;(newimg (car (gimp-image-new (- (car (gimp-image-width img)) blend-x)
(- (car (gimp-image-height img)) blend-y) RGB)))
)
(if (= square 1)
(set! yoffset (+ (- (* (- img-w img-h) 2) (- blend-x blend-y)) overlap))
(set! yoffset overlap)
)
(gimp-undo-push-group-start img)
(gimp-rect-select img 0 0 img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float1 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float1)
(gimp-layer-translate sel-float1 (- (- img-w blend-x) yoffset) (- (- img-h blend-y) overlap))
(gimp-rect-select img img-w 0 img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float2 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float2)
(gimp-layer-translate sel-float2 (- 0 img-w) (- (- img-h blend-y) overlap))
(gimp-rect-select img 0 img-h img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float3 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float3)
(gimp-layer-translate sel-float3 (- (- img-w blend-x) yoffset) (- 0 img-h))
(gimp-rect-select img img-w img-h img-w img-h CHANNEL-OP-REPLACE FALSE 0)
(gimp-edit-copy drawable)
(set! sel-float4 (car (gimp-edit-paste drawable FALSE)))
(gimp-floating-sel-to-layer sel-float4)
(gimp-layer-translate sel-float4 (- 0 img-w) (- 0 img-h))
(gimp-rect-select img (- 0 blend-x) (- 0 blend-x) (+ img-w (/ blend-x 2)) (+ img-h (+ blend-x blend-x)) CHANNEL-OP-REPLACE TRUE (/ blend-x 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float4)
(gimp-rect-select img (- 0 blend-y) (- 0 blend-y) (+ img-w (+ blend-y blend-y)) (+ img-h (/ blend-y 2)) CHANNEL-OP-REPLACE TRUE (/ blend-y 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float4)
(gimp-rect-select img (- (- img-w (- blend-x blend-y)) yoffset) (- 0 blend-y) (+ img-w (+ blend-y blend-y)) (+ img-h (/ blend-y 2)) CHANNEL-OP-REPLACE TRUE (/ blend-y 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float3)
(gimp-rect-select img (- 0 blend-x) (- (- img-h (+ blend-x blend-y)) overlap) (+ img-w (/ blend-x 2)) (+ img-h (+ blend-x blend-x)) CHANNEL-OP-REPLACE TRUE (/ blend-x 1.68))
(gimp-selection-invert img)
(gimp-edit-clear sel-float2)
(gimp-selection-none img)
;(gimp-layer-delete drawable)
(gimp-image-crop img (- (- (* img-w 2) blend-x) yoffset) (- (- (* img-h 2) blend-y) overlap) 0 0)
; Complete the undo group
(gimp-undo-push-group-end img)
; Flush output
(gimp-displays-flush)
)
)
(script-fu-register "script-fu-tile"
"<Image>/Filters/Map/Tileable..."
"Make seamless texture"
"Pavel aka RPG Roshchin <rpg89@post.ru>"
"Pavel aka RPG Roshchin"
"2011"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer to blur" 0
SF-ADJUSTMENT "Blend x" '(100 0 1000 1 10 0 0)
SF-ADJUSTMENT "Blend y" '(100 0 1000 1 10 0 0)
SF-ADJUSTMENT "Overlap" '(0 0 1000 1 10 0 0)
SF-TOGGLE
"Make square texture" TRUE
;SF-ADJUSTMENT "Homogenize brightness (%)" '(70 0 100 1 10 0 0)
)`
如果有人能提供帮助,我会很高兴,因为我很绝望。谢谢!
也许去看看here试试这个方法
但是从外观上看你的:
string a = @"-b ""(script-fu-tile \"""
+ choosenFile
+ "100 100 0 TRUE 70"
+ @")"" -b ""(gimp-quit 0)""";
应该看起来更像这样:
string a = @"gimp-2.6.exe -i -b ""(script-fu-tile \""" +
choosenFile + @"\""0 100 100 0 TRUE 70)"" -b ""(gimp-quit 0)""";
或本质上:
string draw = "0";
string blendx = "100";
string blendy = "100";
string overlap = "0";
string sqrText = "TRUE";
string adjBright = "70";
string a = @"gimp-2.6.exe -i -b ""(simple-unsharp-mask \""" +
path + @"\"" " + draw + " " + blendx + " " + blendy + " " + overlap + " "+ sqrText + " " + adjBright +
@")"" -b ""(gimp-quit 0)""";
从错误信息来看,您提供的代码中的上述字符串存在问题。试试那几个,然后给我评论。
我自己弄明白了 - 问题是,第一个参数 img 需要一个对象,但我写了一个字符串作为第一个参数。所以我编辑了我的 scm 脚本以将对象包装为字符串并且效果很好。