Giter Site home page Giter Site logo

greyclab / gmic Goto Github PK

View Code? Open in Web Editor NEW
59.0 59.0 9.0 215.28 MB

GREYC's Magic for Image Computing: A Full-Featured Open-Source Framework for Image Processing

License: Other

Makefile 2.85% HTML 8.42% Shell 1.70% JavaScript 26.10% CSS 2.87% CMake 1.29% Inno Setup 0.27% C++ 56.25% Scheme 0.26%

gmic's People

Contributors

dtschump avatar grosgood avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

gmic's Issues

GMIC-Qt Crashes Krita when attempting to update filter definitions

Hello,
GMIC-Qt has been crashing Krita when I try to update the filter definitions. I'm not sure how to get a crash log, but I'm happy to provide as much information as I can to reproduce the issue.

  1. Create a new document in Krita, it can be anything. I've had the crash with a 1024x1024 16-bit float file and with a 100x100 8-bit integer one too, so I don't think the file size is the problem.
  2. Select filters and then choose the option that says start GMIC-Qt from the drop-down menu.
  3. Tick the checkbox for internet on the GMIC menu that appears.
  4. Click the button to update filter definitions.
  5. It takes a moment, says filters have been updated, then crashes.

I'm running Krita 5.2.2 without plugins on Windows 11. I've allocated approximately 14 of my 16 GB of RAM, and I don't have a discrete graphics card.

Reverse Fourier Transform doesn't work for G'MIC installed as GIMP plugin

To reproduce:

  • Install the G'MIC plugin in GIMP
  • Open GIMP, load an image. I used https://www.gimp.org/images/frontpage/wilber-big.png
  • Open the plugin dialog with Filters >> G'MIC-Qt...
  • Select Frequencies >> Fourier Transform and click OK to apply the forward transform, closing the plugin dialog. Note that the original image has been transformed.
  • Again, open the plugin dialog with Filters >> G'MIC-Qt... and then select Frequencies >> Fourier Transform and click OK. This will apply the transform again and close the dialog,

At the end of the above steps, the original image is not restored, so in fact the reverse FFT has not been applied correctly as the text instructions claim (they say "Note: Apply this filter once to get the direct FFT, and once again to get the reverse transform.").

Note that the above sequence succeeds in restoring the original image if you instead apply "Frequencies >> Fourier Transform [Old]", although the preview is invalid. (Should a separate bug be filed for the bad preview, or will bugs in the old version not be fixed?)

GIMP: 2.10.36
G'MIC: 3.3.3

Gimp 2.10.36 doesn't detect Gmic 3.2.6 plugin on Windows 10

Hi all,
I just downloaded GIMP 2.10.36 and installed it
I downloaded GMIC 3.2.6 plugin for GIMP, uninstalled previous version and run the 3.2.6 installer.
Now, once GIMP is running, in the filters section I can see GMIC but it is gray-ed and does not launch.
Any suggestion?

Note: the previous version with GIMP 2.10.34 used to work fine

Thanks

Continuous Droste Floating Point Exception + Sometimes Causes BSOD

I've been messing around with the continuous droste effect and have been having repeated issues, both with the GUI for the photoshop plugin and the CLI.

Here is an example of a command I'd run, where the droste component of the command comes from copying directly from the Photoshop plugin GUI after resetting to defaults parameters:
gmic -input 1000.png -souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0 -output output-1000.png

Extremely often, but not quite consistently, it fails like this, for no apparent reason, it just stops:
image

The verbose output seems to suggest it stops at a particular fill command. I'll paste a debug output at the end:
image

What's strange is that at one point, using the same command, it started working if the size of the image was smaller enough (roughly 1000x1000 or less), but now it doesn't again. I've also tried this in a virtual machine and it does the same thing. And it also does it with both version 3.3.5 and 3.3.6, and with both update335.gmic and update336.gmic, which I tested by specifying the exact filter file version:
image

The same thing appears to happen in the photoshop version though, and this one at least gives some kind of error message. In this case, the error occurs immediately when clicking on the Continuous Droste effect, or if the effect was already selected (and therefore it tries to open that immediately), the error occurs immediately after trying to open the plugin:
image

The error 0xc000008f means "Floating-point inexact result". (Technically it could also mean "The system cannot join or substitute a drive to or for a directory on the same drive" but I think the other meaning is more likely).

The reason I noticed image size might be a contributing factor (but not the only factor) is that for a while it worked in the photoshop GUI when I was trying to do the effect on a very large image (6000x6000) and the effect preview window was able to show the effect being done. But if I tried to hit "apply", it would crash, and if I expanded the GUI preview window too large (as to expand the preview image size) it would also crash. Therefore I tried downsizing the image and then it worked in the CLI where it wouldn't before with the large version. But again, now for some reason it won't even work with those same exact smaller images.

Windows Event Viewer log shows that it is indeed the same crash whether in the GUI or CLI, as you can see the "Exception Code" is the same one that is shown in the window of the GUI when it crashes:
image

What's more concerning is if I try to run the command via the CLI too many times in succession, it causes a BSOD. And by this I mean, the command fails and gmic.exe exits, and the terminal window shows the C:\whatever> prompt again, and if I do that too many times in a row too quickly, it BSODs. After it happened the first time, I tried the same thing again to see if it was a fluke, but it happened again. See the event viewer log below showing the crashes (these events don't have info about the cause). The actual stop code for both BSODs was 0000007E aka SYSTEM_THREAD_EXCEPTION_NOT_HANDLED.
image

More strange behavior - I just tried to replicate the BSOD issue in a virtual machine, and while it didn't seem to cause it, it demonstrated the weird inconsistency I was talking about. Here you can see the same command ran back-to-back 5 times and failing each time, but randomly working on the 6th time (see that it actually got to the "output image" stage):
image

Here's a full debug example:

C:\Users\Joe\Downloads\gmic_3.3.5_cli_win64>gmic -debug -input 1000.png -souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0 -output output-1000.png
[gmic]./ Start G'MIC interpreter (v.3.3.5, debug mode).
<gmic>./ Initial command line: 'cli_start , -debug -input 1000.png -souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0 -output output-1000.png'.

<gmic>./ Enter scope './'.
<gmic>./ Item[0]: 'cli_start', selection [].
<gmic>./ Found custom command 'cli_start: ' (takes no arguments).
<gmic>./ Expand command line for command 'cli_start' to: ''.
<gmic>./cli_start/ Return from empty command 'cli_start/'.
<gmic>./ Item[2]: '-debug' -> 'debug', selection [].
<gmic>./ Item[3]: '-input' -> 'input', selection [].
<gmic>./ Command 'input': arguments = '1000.png'.
[gmic]./ Input file '1000.png' at position 0 (1 image 1000x1000x1x3).
<gmic>./ Item[5]: '-souphead_droste10' -> 'souphead_droste10', selection [0].
<gmic>./ Found custom command 'souphead_droste10:  _souphead_droste10 ${1-26},0,${28-31}' (takes arguments).
<gmic>./ Command 'souphead_droste10': arguments = '40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0'.
<gmic>./ Found 31 given arguments for command 'souphead_droste10':
<gmic>./   $1 = '40'
<gmic>./   $2 = '100'
<gmic>./   $3 = '1'
<gmic>./   $4 = '1'
<gmic>./   $5 = '1'
<gmic>./   $6 = '0'
<gmic>./   $7 = '0'
<gmic>./   $8 = '0'
<gmic>./   $9 = '0'
<gmic>./   $10 = '0'
<gmic>./   $11 = '1'
<gmic>./   $12 = '10'
<gmic>./   $13 = '1'
<gmic>./   $14 = '0'
<gmic>./   $15 = '90'
<gmic>./   $16 = '0'
<gmic>./   $17 = '0'
<gmic>./   $18 = '0'
<gmic>./   $19 = '0'
<gmic>./   $20 = '1'
<gmic>./   $21 = '0'
<gmic>./   $22 = '0'
<gmic>./   $23 = '1'
<gmic>./   $24 = '0'
<gmic>./   $25 = '0'
<gmic>./   $26 = '0'
<gmic>./   $27 = '0'
<gmic>./   $28 = '0'
<gmic>./   $29 = '1'
<gmic>./   $30 = '0'
<gmic>./   $31 = '0'
<gmic>./ Expand command line for command 'souphead_droste10' to: ' _souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0'.
<gmic>./ Decompose command line into 2 items:
<gmic>./   item[0] = '_souphead_droste10'
<gmic>./   item[1] = '40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0'

<gmic>./souphead_droste10/ Enter scope 'souphead_droste10/'.
<gmic>./souphead_droste10/ Item[0]: '_souphead_droste10', selection [0].
<gmic>./souphead_droste10/ Found custom command '_souphead_droste10:  repeat $! l[$>] to_a +f. 0 sh. 0 f. "* begin(InnerRadius = $1; OuterRadius = $2; Periodicity = $3; Strands = $4; Zoom = $5; Rot(...),ColorOutA=1); i(#1,x,y,0,1)=ColorOutG*255; i(#1,x,y,0,2)=ColorOutB*255; i(#1,x,y,0,3)=ColorOutA*255; ColorOutR*255" k.. done done' (takes arguments).
<gmic>./souphead_droste10/ Command '_souphead_droste10': arguments = '40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0'.
<gmic>./souphead_droste10/ Found 31 given arguments for command '_souphead_droste10':
<gmic>./souphead_droste10/   $1 = '40'
<gmic>./souphead_droste10/   $2 = '100'
<gmic>./souphead_droste10/   $3 = '1'
<gmic>./souphead_droste10/   $4 = '1'
<gmic>./souphead_droste10/   $5 = '1'
<gmic>./souphead_droste10/   $6 = '0'
<gmic>./souphead_droste10/   $7 = '0'
<gmic>./souphead_droste10/   $8 = '0'
<gmic>./souphead_droste10/   $9 = '0'
<gmic>./souphead_droste10/   $10 = '0'
<gmic>./souphead_droste10/   $11 = '1'
<gmic>./souphead_droste10/   $12 = '10'
<gmic>./souphead_droste10/   $13 = '1'
<gmic>./souphead_droste10/   $14 = '0'
<gmic>./souphead_droste10/   $15 = '90'
<gmic>./souphead_droste10/   $16 = '0'
<gmic>./souphead_droste10/   $17 = '0'
<gmic>./souphead_droste10/   $18 = '0'
<gmic>./souphead_droste10/   $19 = '0'
<gmic>./souphead_droste10/   $20 = '1'
<gmic>./souphead_droste10/   $21 = '0'
<gmic>./souphead_droste10/   $22 = '0'
<gmic>./souphead_droste10/   $23 = '1'
<gmic>./souphead_droste10/   $24 = '0'
<gmic>./souphead_droste10/   $25 = '0'
<gmic>./souphead_droste10/   $26 = '0'
<gmic>./souphead_droste10/   $27 = '0'
<gmic>./souphead_droste10/   $28 = '0'
<gmic>./souphead_droste10/   $29 = '1'
<gmic>./souphead_droste10/   $30 = '0'
<gmic>./souphead_droste10/   $31 = '0'
<gmic>./souphead_droste10/ Expand command line for command '_souphead_droste10' to: ' repeat $! l[$>] to_a +f. 0 sh. 0 f. "* begin(InnerRadius = 40; OuterRadius = 100; Periodicity = 1; Strands = 1; Zoom = 1; Rotat(...),ColorOutA=1); i(#1,x,y,0,1)=ColorOutG*255; i(#1,x,y,0,2)=ColorOutB*255; i(#1,x,y,0,3)=ColorOutA*255; ColorOutR*255" k.. done done'.
<gmic>./souphead_droste10/ Decompose command line into 13 items:
<gmic>./souphead_droste10/   item[0] = 'repeat'
<gmic>./souphead_droste10/   item[1] = '$!'
<gmic>./souphead_droste10/   item[2] = 'l[$>]'
<gmic>./souphead_droste10/   item[3] = 'to_a'
<gmic>./souphead_droste10/   item[4] = '+f.'
<gmic>./souphead_droste10/   item[5] = '0'
<gmic>./souphead_droste10/   item[6] = 'sh.'
<gmic>./souphead_droste10/   item[7] = '0'
<gmic>./souphead_droste10/   item[8] = 'f.'
<gmic>./souphead_droste10/   item[9] = '* begin(InnerRadius = 40; OuterRadius = 100; Periodicity = 1; Strands = 1; Zoom = 1; Rotate = 0; XShift = 0; YShift = 0; XCenterShift = 0; YCenterShift = 0; StartingLevel = 1; NumberOfLevels = 10; LevelFrequency = 1; ShowBothPoles = 0; PoleRotation = 90; PoleLong = 0; PoleLat = 0; TilePoles = 0; HyperDroste = 0; FractalPoints = 1; AutoSetPeriodicity = 0; NoTransparency = 0; ExternalTransparency = 1; MirrorEffect = 0; Untwist = 0; DoNotFlattenTransparency = 0; ShowGrid = 0; ShowFrame = 0; Antialias = 1; XEdgeType = 0; YEdgeType = 0; r1 = InnerRadius/100; r2 = OuterRadius/100; p1 = Periodicity; p2 = Strands; xCenterShift = XCenterShift/100; yCenterShift = YCenterShift/100; W = (w-1)/2; H = (h-1)/2; xShift = (XShift*w/W)/100; yShift = (YShift*h/H)/100; tileBasedOnTransparency=!(NoTransparency); transparentPointsIn=!(ExternalTransparency); levelsToLookOut=StartingLevel; levelToShow=LevelFrequency; retwist=!(Untwist); if (AutoSetPeriodicity\,p1=p2/2*(1+sqrt(1-(log(r2/r1)/pi)^2))); if (p1>0\,rotat(...)
<gmic>./souphead_droste10/   item[10] = 'k..'
<gmic>./souphead_droste10/   item[11] = 'done'
<gmic>./souphead_droste10/   item[12] = 'done'

<gmic>./souphead_droste10/_souphead_droste10/ Enter scope '_souphead_droste10/'.
<gmic>./souphead_droste10/_souphead_droste10/ Item[0]: 'repeat', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/ Command 'repeat': arguments = '$!' -> '1'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/ Start 'repeat...done' block (1 iteration).
<gmic>./souphead_droste10/_souphead_droste10/*repeat/ Item[2]: 'l[$>]' -> 'l[0]', selection [0].
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/ Start 'local...done' block, with image [0].

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Enter scope '*local/'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Item[3]: 'to_a', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Found custom command 'to_a:  e[^-1] "Force image$? to have an alpha channel." foreach { if !s||s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." elif s==1||s==3 channels 0,{s} sh. {s-1} f. 255 rm. fi }' (takes no arguments).
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Expand command line for command 'to_a' to: ' e[^-1] "Force image$? to have an alpha channel." foreach { if !s||s>4 error[0--5] "Command 'to_a': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." elif s==1||s==3 channels 0,{s} sh. {s-1} f. 255 rm. fi }'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Decompose command line into 19 items:
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[0] = 'e[^-1]'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[1] = 'Force image$? to have an alpha channel.'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[2] = 'foreach'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[3] = '{'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[4] = 'if'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[5] = '!s||s>4'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[6] = 'error[0--5]'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[7] = 'Command 'to_a': Image [$>] is not a G\,GA\,RGB or RGBA image ({s} channels).'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[8] = 'elif'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[9] = 's==1||s==3'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[10] = 'channels'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[11] = '0,{s}'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[12] = 'sh.'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[13] = '{s-1}'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[14] = 'f.'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[15] = '255'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[16] = 'rm.'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[17] = 'fi'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/   item[18] = '}'

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/ Enter scope 'to_a/'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/ Item[0]: 'e[^-1]', selections [0,1,2,3,4].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/ Command 'echo': arguments = 'Force image$? to have an alpha channel.' -> 'Force image [0] to have an alpha channel.'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/ Force image [0] to have an alpha channel.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/ Item[2]: 'foreach', selection [0].
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Start 'foreach...done' block, with image [0].

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Enter scope '*foreach/'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Item[4]: 'if', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Command 'if': arguments = '!s||s>4'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Start 'if...endif' block -> condition '!s||s>4' does not hold.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[8]: 'elif', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Command 'elif': arguments = 's==1||s==3'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Reach 'elif' block -> condition 's==1||s==3' holds.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[10]: 'channels', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Found custom command 'channels: skip ${2=$1} e[^-1] "Keep channels $1...$2 of image$?." z 0,0,0,$1,100%,100%,100%,$2' (takes arguments).
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Command 'channels': arguments = '0,{s}' -> '0,3'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Found 2 given arguments for command 'channels':
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   $1 = '0'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   $2 = '3'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Expand command line for command 'channels' to: 'skip 3 e[^-1] "Keep channels 0...3 of image$?." z 0,0,0,0,100%,100%,100%,3'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Decompose command line into 6 items:
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[0] = 'skip'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[1] = '3'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[2] = 'e[^-1]'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[3] = 'Keep channels 0...3 of image$?.'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[4] = 'z'
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/   item[5] = '0,0,0,0,100%,100%,100%,3'

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Enter scope 'channels/'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Item[0]: 'skip', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Command 'skip': arguments = '3'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Skip argument '3'.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Item[2]: 'e[^-1]', selections [0,1,2,(...),5,6,7].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Command 'echo': arguments = 'Keep channels 0...3 of image$?.' -> 'Keep channels 0...3 of image [0].'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Keep channels 0...3 of image [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Item[4]: 'z', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Command 'crop': arguments = '0,0,0,0,100%,100%,100%,3'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Crop image [0] with coordinates (0,0,0,0) - (100%,100%,100%,3) and dirichlet boundary conditions.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/channels/ Exit scope 'channels/'.

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[12]: 'sh.', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Command 'shared': arguments = '{s-1}' -> '3'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Insert shared buffer from channel 3 of image [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[14]: 'f.', selection [1].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Command 'fill': arguments = '255'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Fill image [1] with 255.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[16]: 'rm.', selection [1].
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Remove image [1] (1 image left).
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ Item[17]: 'fi', selection [0].
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/*if/ End 'if...endif' block.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Item[18]: '}', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/*foreach/ Exit scope '*foreach/'.

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/to_a/ Exit scope 'to_a/'.

<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Item[4]: '+f.' -> 'f.', selection [0].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Command 'fill': arguments = '0'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/ Fill image [0] with 0.
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Item[6]: 'sh.', selection [1].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Command 'shared': arguments = '0'.
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/ Insert shared buffer from channel 0 of image [1].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Item[8]: 'f.', selection [2].
<gmic>./souphead_droste10/_souphead_droste10/*repeat/*local/ Command 'fill': arguments = '* begin(InnerRadius = 40; OuterRadius = 100; Periodicity = 1; Strands = 1; Zoom = 1; Rotate = 0; XShift = 0; YShift = 0; XCenterShift = 0; YCenterShift = 0; StartingLevel = 1; NumberOfLevels = 10; LevelFrequency = 1; ShowBothPoles = 0; PoleRotation = 90; PoleLong = 0; PoleLat = 0; TilePoles = 0; HyperDroste = 0; FractalPoints = 1; AutoSetPeriodicity = 0; NoTransparency = 0; ExternalTransparency = 1; MirrorEffect = 0; Untwist = 0; DoNotFlattenTransparency = 0; ShowGrid = 0; ShowFrame = 0; Antialias = 1; XEdgeType = 0; YEdgeType = 0; r1 = InnerRadius/100; r2 = OuterRadius/100; p1 = Periodicity; p2 = Strands; xCenterShift = XCenterShift/100; yCenterShift = YCenterShift/100; W = (w-1)/2; H = (h-1)/2; xShift = (XShift*w/W)/100; yShift = (YShift*h/H)/100; tileBasedOnTransparency=!(NoTransparency); transparentPointsIn=!(ExternalTransparency); levelsToLookOut=StartingLevel; levelToShow=LevelFrequency; retwist=!(Untwist); if (AutoSetPeriodicity\,p1=p2/2*(1+sqrt(1-(log(r2/r1)/pi)^2)))(...)
[gmic]./souphead_droste10/_souphead_droste10/*repeat/*local/ Fill image [2] with expression '* begin(InnerRadius = 40; OuterRadius (...)x,y,0,3)=ColorOutA*255; ColorOutR*255'.

Wrong generated colormap

I observed a strang behaviour using the colormap command on an image with few colors.

To reproduce the issue I used a source image in 24 bit color format that uses exactly 16 colors.
rgb24_16_colors
Then I executed following comands with gmic version 3.3.3:

1) gmic input rgb24_16_colors.png colormap[0] 0,1,1 output palette_colormap_0-1-1.png 
2) gmic input rgb24_16_colors.png colormap[0] 0,1,2 output palette_colormap_0-1-2.png 
3) gmic input rgb24_16_colors.png colormap[0] 16,1,1 output palette_colormap_16-1-1.png 
4) gmic input rgb24_16_colors.png colormap[0] 16,1,2 output palette_colormap_16-1-2.png 

Command 1 and 2 uses "nb_levels=0". This extracts all colors from the source image.
These commands produce a correct result: A palette with exactly 16 colors. The results only differ by the sorting method.

Result command 1: palette_colormap_0-1-1
Result command 2: palette_colormap_0-1-2

Command 3 and 4 uses "nb_levels=16". The generated colormaps contains colors that aren't available in the source image
and there are some double entries.

Result command 3: palette_colormap_16-1-1
Result command 4: palette_colormap_16-1-2

I expected that command 1+3 and 2+4 would produce the same result.

I get another strange result if I use "nb_levels=256":

gmic input rgb24_16_colors.png colormap[0] 256,1,2 output palette_colormap_256-1-2.png

In this case a colormap with 256 entries is generated with a lot of double entries although I would expect that the result should only have 16 colors.

palette_colormap_256-1-2

Is this a bug or did I not properly understand how the colormap command works?

I also recognized that the colormap command with gmic version 3.1.6 produces different results for command 3 and 4.

Warp Plugin [Interactive] in version 2.2.4 - slow

Warp Plugin [Interactive] in version 2.2.3 works fine in Photoshop, in the new version 3.2.4 it is very slow in applying changes to the image. The program keeps calculating the process for several minutes for an adjustment that in version 2.23 is done in a few seconds.

Photoshop v23
GmicPlugin_x64 (version that works for me)

Feature Request: A function to return the number of unique elements.

Basically, I would like to be able to set const variable with the number of unique elements in a vector. So, const out_size=unique_count([1,2,4,2,2]); and out_size would return 3 because there are only 3 unique elements.

Or better yet, a function to return only unique elements as a vector. Something akin to colormap 0.

G'mic installation to GIMP

I tried to install either the zip or installer (exe) but I got an error either way. I get the 0xc000007b error via Zips (and installing the pic 2 libs) along with when I try to click the installer I cannot open it at all. I get hit with what is shown in pic 3. I am on Windows 11 build 23H2 version KB5034123
Screenshot 2024-01-21 043228
Screenshot 2024-01-21 042300
Screenshot 2024-01-21 042335

v2s() might be not working properly.

It seems that rep_find_factors_of is broken for some number. For instance 756.

Pay attention to the data, and the echo output near "G'MIC Interpreter". They're different for this number and some few other number. But, yet 256,100, and many other numbers work fine. This points to v2s() issues.

C:\Windows\System32>gmic echo ${rep_find_factors_of\ 756}
[gmic]-0./ Start G'MIC interpreter.
[gmic]-1./*substitute/rep_find_factors_of/*if#94/ Display image [0] = '[unnamed]', from point (0,1,0).
[0] = '[unnamed]':
  size = (1,3,1,3) [36 b of float32].
  data = (2;3;7 ^ 2;3;1 ^ 0;0;0).
  min = 0, max = 7, mean = 2, std = 2.23607, coords_min = (0,0,0,2), coords_max = (0,2,0,0).
[gmic]-2./*substitute/rep_find_factors_of/*if#94/ Display images [0,1] = '[unnamed], [begin( const num_of_primes(...)_of_primes,0); modulo_list[0]=tv=1; r', from point (0,1,0).
[0] = '[unnamed]':
  size = (1,3,1,3) [36 b of float32].
  data = (2;3;7 ^ 2;3;1 ^ 0;0;0).
  min = 0, max = 7, mean = 2, std = 2.23607, coords_min = (0,0,0,2), coords_max = (0,2,0,0).
[1] = '[begin( const num_of_primes=h#-(...)primes,0); modulo_list[0]=tv=1; repea:
  size = (24,1,1,1) [96 b of float32].
  data = (1,2,4,3,6,12,9,18,36,27,54,108,7,14,28,21,42,84,63,126,252,189,378,756).
  min = 1, max = 756, mean = 93.3333, std = 168.36, coords_min = (0,0,0,0), coords_max = (23,0,0,0).
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2
[gmic]-0./ End G'MIC interpreter.

Here's the modified command for rep_find_factors_of for testing purpose only.

#@cli rep_find_factors_of: num_0...
#@cli : Return the factors found in all numbers at once.
#@cli :
#@cli : Author : Reptorian.
#@cli : $ echo ${rep_find_factors_of\ 256}
#@cli : $ echo ${rep_find_factors_of\ 256,100}
#@cli : $ echo ${rep_find_factors_of\ 256,100,50}
rep_find_factors_of:
if !$# error ("\$\#">0)==F fi

if $#==1
 v=$1

 if $v<0 error inv_inp
 elif $v>5000000000000000 error exc_lim
 elif $v!=int($v) error inv_inp
 elif $v<2 u $v return
 fi

else

 if $#>2 v=${rep_gcd_multiple_numbers\ $*}
 else v={gcd(${1-2})}
 fi

 if $v<2 u $v return fi

fi

1,1,1,3 # Prime Value, Base, Error

eval "
 start_v=v=$v;
 square=int(sqrt(v));

 for(n=2,n<=square&&n<=v,++n,

  isPrime=1;

  for(p=0,p<da_size(#-1),++p,

   prime=(I[#-1,p])[0]-(I[#-1,p])[2];

   if(sqr(prime)>n,
    break();
   );

   if(!(n%prime),
    isPrime=0;
    break();
   );

  );

  if(isPrime,

   count=0;

   while(!(v%n),
     ++count;
     v/=n;
   );

   if(count,
    da_push(#-1,[n,count,0]);
    diff=(da_back(#-1))[0]-n;
    if(diff,I[#-1,da_size(#-1)-1]=[n,count,diff]);
    square=int(sqrt(v));
   );

  );

 );

 if(v!=1,
  da_push(#-1,[v,1,0]);
  diff=(da_back(#-1))[0]-v;
  if(diff,I[#-1,da_size(#-1)-1]=[v,1,diff]);
 );

 output=da_size(#-1)==1&&v==start_v?v:0;
 da_freeze(#-1);

 if(output,
  set('pv',v);
 );

 output;"
 
if ${}
 remove.
 status 1,$pv
else
 display
 {prod(crop(0,0,0,1,1,h,1,1)+1)},1,1,1,"begin(
   const num_of_primes=h#-1;
   primes_freq_choices=crop(#-1,0,0,0,1,1,num_of_primes,1,1)+1;
   primes_list=crop(#-1,0,0,0,0,1,num_of_primes,1,1)-crop(#-1,0,0,0,2,1,num_of_primes,1,1);
   modulo_list=vector(#num_of_primes,0);
   modulo_list[0]=tv=1;
   repeat(num_of_primes-1,p,
    tv*=primes_freq_choices[p];
    modulo_list[p+1]=tv;
   );
   result=vector(#w,0);
  );
  m=int(x/modulo_list)%primes_freq_choices;
  result[x]=prod(primes_list^m);
  end(
   set('{}',v2s(sort(result)));
  );
  "
 display
 remove[-2,-1]
fi

Note that in the last display instance, it appears there's all the numbers which are the factor of 756. However, it doesn't show up with ${} for some reason. Another number which is wrong is 1110. This only happens with some numbers. In many cases, it works as expected.

Error report with the filter Morph (not using the good Ubuntu version...)

Hi
Just to report an error message with the filter Morph [Interactive] :

*** Error in ./fx_morph_interactive/x_morph/*repeat/*local/*substitute/max_wh/_minmax_whds/ *** Item substitution '{ mw = w; mh = h; md = d; ms = (...)s#k); ); ([mw,mh,md,ms])[0,2]}': Unrecognized function call 'repeat( l,k, mw = max(mw,w#k); mh = max(mh,h#k); md = max(m(...)' in expression '...repeat( l,k, mw = max(mw,w#k); mh = max(mh,h#k); md = max(m(...)...'.

I use the last version 3.3.0 of "Ubuntu 22.04 Jammy: Plug-in for GIMP 2.10" with GIMP 2.10.30 on ... Ubuntu 23.04 ... maybe is it the cause of the issue? (But many other filters work anyway)
If it is just because of the Ubuntu version, sorry! But if not, I hope my report could be helpful.
Thanks!

fx_vibrance doesn't work well on the command line

This problem is in version 3.3.2, and can be seen on both Windows and Linux. fx_vibrance works well for negative strength values, but not for positive values. The problem is the worst if the output is a PNG file, for example:

gmic input.png fx_vibrance 1.58 output out.png

I noticed that there seems to be some kind of overflow, and if I add the cut 0,255 command as a second command before creating the output file, then it's OK. Vibrance works well in Gimp, probably because Gimp cuts it automatically.

Repository error?

What happened to the commit history, tags, etc?
Was there some sort of GitHub issue that required this? The loss of a project's history, commit messages, issues, MRs, etc.. is a huge blow to the project, so I'm sorry to see this loss of yours.

Apply Color Presets using command line

Hi

I've been using Gimp and Gmic plugin for a while now and I'm looking for a way to automatize applying filter to many photos with a shell script.

The filters I want to apply are the "Colors/Color Presets", lets's say for the example "Cinematic Travel/Warm Teal"

Screenshot from 2023-11-16 15-27-32

How can I apply it with a command line, using gmic directly?
Is there a way to customize the configuration values (contrast, gamma, hue ...) of the filter ?

Thanks

Enable optional cli_end command.

This would be useful when importing .gmic script. Just before the End G'MIC interpreter you can make G'MIC execute __main__ or whatever you want to call to execute from the imported G'MIC script.

EDIT: Easiest way seems to be checking if command cli_end exists and to execute it right at the beginning of _display if it does.

EDIT 2: Just as I mentioned in the forum, basically all that is needed for this to happen is inserting if ['$$cli_end']!=0 cli_end fi under _display right at the very beginning, and there you have a easy way to allow optional cli_end command.

Suggestion, allow multiple arguments in place of arg... convention in math parser.

I think G'MIC should detect whether the last one is using arg... or not instead of having it as the only argument. To explain, here's a code:

Current implementation

foo:

status {"
  generate_random_numbers_with_exclusion(input...)=(
    ref([input],v_inp);
    s_in=size(v_inp);
    if(s_in<=3,run('error inv_inp'););
    number_of_exclusion=s_in-2;
    si=v_inp[0]; # start_index
    ei=v_inp[1]; # start_end
    do(
      rn=int(u(si,ei,1,0));
      for(p=2,p<s_in,++p,
      if(rn<v_inp[p],break(););
      ++rn;
     );
    ,rn>=ei);
  rn;
 );
 generate_random_numbers_with_exclusion($*);
 "}

With suggestion

foo:

status {"
  generate_random_numbers_with_exclusion(start_index,end_index,arg...)=(
    ref([arg],v_inp);
    do(
      rn=int(u(start_index,end_index,1,0));
      repeat(size(v_inp),p,
        if(rn<v_inp[p],break(););
        ++rn;
      );
    ,rn>=end_index);
    rn;
  );
 generate_random_numbers_with_exclusion($*);
 "}

Which is easier to understand? The second one. And it's shorter, easier to format too.

erreur avec g-mic

bonjour je Vien de installer g-mic qt sur mon pc dans gimp mes quand je veus recolorizer avec le filyre il me mes ce message d'erreur : preview error
error in ./gimp_recolorize_20130115_modifie/command 'rv'.invalid selection '(-2,-1)'(contains index -1,not in range -1 ...0).
et j'ai le meme message avec paint net pourier vous me dire ce que je doit faire cher la version de gimp 2.10.36 est ce que ces parceque il faut attendre une nouvelle mis a jour de g-mic qt en vous remercient

Problème dll

Bonjour,

Gmic ne s'ouvre pas dans Gimp 2.10.36. Problème de dll : libgcc_s_seh-1.dll

Merci de vos réponses

Makefile doesn't fit for downstream packagers

I just got aware that the src/Makefile doesn't fit for downstream packagers i.e. on Gentoo and gmic is announced to be dropped entirely. (gentoo bug 916289)

My quick search lead to some patches on gentoo - OTOH I didn't see any upstreaming back here...

So my motivation is to enable upstreaming gentoo patches
@dtschump Can you have a look at those patches and see if you could integrate them in gmic to facilitate downstream packagers life?

I also whish you could

  • add Github Action CI tests (would you be open for some PR?)
  • elaborate an easy working make process for downstream (I don't know the exact pain points though)

Variable to determine what threaded model is a math parser using?

At the moment, I would like to have a variable within the math parser which is a constant, and tells me whether it is a multi-threaded process or not. I know that behind the scene, when the processing mode is not specified, G'MIC will choose it for you automatically. And I'm working on a code which contains conditionals in order to get around this.

how to install

the exe gives me a folder with a lot of shit in it that doesnt want to start up and the gimp doesnt have the thing in it and yes i have restarted everything a houndred times
where the fuck do i put the stuff in the folder why is there no instructions anywhere

Frames > Polaroid > Curvature Setting

Hello,

Thank you for such an awesome project!

I have not been able to use the (Curvature) setting when using this frame filter.

Having all settings to (0), and only using the (Y-shadow) to around 3, and setting the (Smoothness), and wanting to set a (Curvature) for the shadow, it will not adjust the shadow's curvature like before. The last version of GMIC that I was able to use the curvature setting was 3.2.6.

Thank you for your help.

Two missing DLL files on Windows with GIMP 2.10.36

Version 3.3.1 of the GMIC GIMP plugin on Windows (64 bit) requires libicudt72.dll and libicuuc72.dll, which it expects to find in the GIMP bin directory. But the new GIMP version, 2.10.36, has libicudt73.dll and libicuuc73.dll instead.
I was able to run GMIC by copying libicudt72.dll and libicuuc72.dll from Inkscape 1.3 into C:\Program Files\GIMP 2\bin\ but of course GMIC should be upgraded to the new versions of these DLLs.

gmd2html doesn't use standard DOM structure (HTML heading elements)

If the following .gmd source is run through gmd2html:

# 1. Section title
## 1.1. Sub-section title
### 1.1.1. Sub-sub-section title
#### 1.1.1.1. Sub-sub-sub-section title

The resulting HTML source will be (wrapped for readability):

<a name="_1_section_title"></a>
<div class="gmd_section">1. Section title</div>
<a name="_1_1_sub_section_title"></a>
<div class="gmd_subsection">1.1. Sub-section title</div>
<a name="_1_1_1_sub_sub_section_title"></a>
<div class="gmd_subsubsection">1.1.1. Sub-sub-section title</div>
<a name="_1_1_1_1_sub_sub_sub_section_title"></a>
<div class="gmd_subsubsubsection">1.1.1.1. Sub-sub-sub-section title</div>

The use of semantic structural elements, including headings to label sections of a document, has accessibility implications and is one of the WCAG Success Criteria for accessible web content. All users, but especially those using assistive technologies, use headings to navigate page content. From the point of view of a screen reader or other assistive device, a styled <div> that looks like a heading is not remotely the same thing as a recognized HTML heading element (<h1> through <h6>).

From the first link above (WebAIM: Semantic Structure):

Implementing Headings

Headings must use heading tags.

Screen readers and assistive technologies rely on heading tags (<h1> - <h6>) to identify headings. Text that is merely large, bold, or emphasized is not interpreted as a heading unless the <h1> - <h6> markup is used.

Use headings only when they represent following content.

To highlight or emphasize text that is not a heading, use styles—not heading tags—to achieve visual results.

Error in this simple code snip.

C:\Windows\System32
λ gmic 2,1,1,1,x+2
[gmic]./ Start G'MIC interpreter (v.3.3.2).
[gmic]./ Input file '2' at position 0
[gmic]./ *** Error *** Command 'input': File '2', format does not take any input options (options '1,1,1,x+2' specified).

Just leaving this here.

Multiple numbers within chars issue.

As you noticed on the forum, I have figured out how to display characters correctly. However, with the custom command I have made, they don't work well because this example:

e {`'é'`}

would print multiple numbers. And my string_permutation* family commands do involve sorting characters. And the fact that this prints multiple numbers would lead to complications as my code didn't account for that, and I don't see a easy way to account for that.

More Ways for GMIC to Make Some Dough

Hi,
I hope this message finds you well, healthy, and most importantly ... Happy!!!
I hope this helps ya make some more dough!!!

Much love!!! ✌
.ƹ.

"Without ART, the eARTh would just be 'eh'!"
ოΓ. ǝ

More Ways For GMIC to Make Some Dough

Tried to download and install G'MIC for Gimp, but respond missing files

I have download the latest stable version of G'MIC for Gimp, but the installer respond with a bunch of missing files. Then, i downloaded the standalone version of G'MIC and it worked just fine. I think you should recheck that all files are included into the plug-in version for Gimp.
Gmic1

this was one of the missing files...

I am using Windows 11, 64 bits.

Debian 12 Gimp has gmic grayed out

I've tried a regular, standard debian 12 repo install of gimp and gimp-gmic, now a flatpak version of gimp (2.10.36) and gmic (3.3.1) -- and both show gmic as grayed out and inaccessible in the Gimp Filters menu. Any ideas what to do?

Operator '=': Second argument (of type 'scalar') is not a constant, in expression

Is there a reason why this problem shows up?

foo 15,10
foo:
eval "
 const max_number=int(abs($1));
 const base=int(abs($2));
 const log_base=log(base);

 logb(n)=log(n)/log_base;
 concat_consec_digits_count(n)=n>=base?(tn=floor(logb(n));n+(n+1)*tn+(base*(1-base^tn))/(base-1)):n;
 
 const number_of_digits_in_concatenated_number=concat_consec_digits_count(max_number);"

I'm pretty sure everything is a const.

EDIT: Oh, the additional ";". That's why.

Cmake reports error File Not Found for GmicConfig.cmake

Attempting to make gmic_qt from source and following cmake build instruction steps:

CMake

cmake works on all platforms. The first part is the same and requires make and wget to be available. If you don't have all dependencies, cmake will warn you which ones are missing. Note that the minimum cmake version is 3.1.

git clone https://github.com/GreycLab/gmic.git
git clone https://github.com/c-koi/gmic-qt.git
make -C gmic/src CImg.h gmic_stdlib_community.h
cd gmic-qt

Then make a build directory:

mkdir build
cd build

cmake .. [-DGMIC_QT_HOST=none|gimp|paintdotnet|8bf] [-DGMIC_PATH=/path/to/gmic] [-DCMAKE_BUILD_TYPE=[Debug|Release|RelwithDebInfo]
make

From Terminal (first was an attempt to put gmic cli app in my local home bin folder, second was an attempt to point cmake at the downloaded source files after the error was displayed:

 1108  1/1/2024 13:13  cmake .. -DGMIC_QT_HOST=none -DGMIC_PATH=/home/guyst/bin/gmic -DCMAKE_BUILD_TYPE=Release
...
 1109  1/1/2024 13:13  cmake .. -DGMIC_QT_HOST=none -DGMIC_PATH=/home/guyst/source/gmic/src/gmic -DCMAKE_BUILD_TYPE=Release

Leads to following error:

CMake Error at CMakeLists.txt:152 (find_package):
  Could not find a package configuration file provided by "Gmic" with any of
  the following names:

    GmicConfig.cmake
    gmic-config.cmake

  Add the installation prefix of "Gmic" to CMAKE_PREFIX_PATH or set
  "Gmic_DIR" to a directory containing one of the above files.  If "Gmic"
  provides a separate development package or SDK, be sure it has been
  installed.

I used find on the source folders and no file with either of those names is included with the source for gmic or gmic-qt downloads. I WAS able to successfully build with qmake after installing a LOT of dependencies, but it did work and is currently installed and functioning.

Thought someone should know.

Small improvement suggestion on quit command.

There should be a default terminating echo message which is: [gmic]./ End G'MIC interpreter.. Optionally, arguments would override this message.

Now I have something like this for one of my personal user command to run Python files that aids in G'MIC scripting.

e[0] "End G'MIC interpreter."
quit

With a default print message, that can be shortened to just q or quit. I also noticed that commands that use q/quit typically don't have other codes beyond q/quit.

Here's the command code I'm using, so maybe I'm missing something here?

#@cli run_pyscript:
#@cli : Run user-defined script. If you provide no argument, then it will print description on how to use your script. If you ran into a error, run without an argument, and modify your argument to make this work.
run_pyscript:
    skip "${1=}"
    
    _available_variables=""
    _number_of_available_scripts=0
    script_file_info="D:\\Documents\\Python\\gmic-scripting-tools\\"

    _$0_info shift_vars_num,GMIC-Increment-Arg-Number.py,"Shift variables numbers."
    _$0_info modify_gui_vars,GUI-variable-inputs.py,"Modify GUI Variables to append numbers or to remove numbers into GUI Variables."
    
    
    if narg($1)
        if isint($1)
         id=${arg\ $1+1,$_available_variables}
        else
         id=$1
        fi
        
        test_input=${_script_${id}_filename}
        if !narg($test_input) error invalid_arg fi
        script_file_info.=$test_input   
        
        e[0] "Executing script "${_script_${id}_filename}!\n
        exec 1,"python "$script_file_info
        e[0] "Finished executing script "${_script_${id}_filename}!
    else
        e[0] "Allowed arguments: 0-"{$_number_of_available_scripts-1}"(inclusive) or "$_available_variables.
        repeat $_number_of_available_scripts {
         current_variable=${arg\ $>+1,$_available_variables}
         e[0] Arg\ $>\ :\ $current_variable\ -\ ${_script_${>}_helper}
        }
    fi
    
    e[0] "End G'MIC interpreter."
    quit
_run_pyscript_info:
    check "$#==3"

    if narg($_available_variables)
     _available_variables.=,$1
    else
     _available_variables.=$1
    fi
    
    _script_$1_filename="$2"
    _script_$1_helper="$3"
    
    _number_of_available_scripts+=1

(Feature Idea) Literals to affect inputs

I just have a idea to extend the usage of binary/hex literals outside of the math parser.

Syntax:

-0x(100,200)

This would be equivalent of

(256,512)

The reason I think this is a good idea is that some languages use hexadecimal to generate palettes. At the moment, we have to do a little bit of finicky thing to bypass the issue of conversion.

Some other suggestion for syntax:

-0x3(AABBCC,DDEEFF)

The number after -0x tells us the number of channels in the output image. So, first pixel is #AABBCC.Yes, this would mean ^ wouldn't be allowed, but for simplicity of conversion, this is fine. Other characters are permitted like [ , ] or [ / ] or [ ; ]. And of course, to enforce the numbers of characters. So, 3 would means 6 characters for each numbers, 4 would mean 8 characters, and so forth.

The reason for -0x is that 0x is reserved for numbers of 0x0x0x0 image.

And of course, you can extend this concept to binary like -0b() or -0bN() where N is the number of channels. You could argue of -0dN() for decimals, as it can be done too and it can be even easier to work with too.

Some catch is that this might require c-koi to make new color dialogs for each cases and they output 1 string variable per color. This would simplify the process of making palettes with GUI. prawnsushi for example struggled with inputs, and this alleviates that issue.

G'MIC-Qt Plug-in in Affinity 2.4.2

I don't seem to be able to get the plug-in to load in Affinity Photo 2.4.2 installed on Win 11 LG Laptop.
I have followed the instructions and every time I try to use the plug-in I get the following message - "CreateProcess failed; unknown error".
I have tried installing the plug-in in other locations where other plug-ins are installed and working and the result is always the same error message.

Lost in Ubuntu

G'MIC asks which Ubuntu. I don't know, I didn't build this box. Also, I need to upgrade my present G'MIC in my GIMP. I have no clues...

Using G'MIC, Windows has some effects not in Linux

I use the G'MIC plugin in GIMP in Windows and Linux. Exploring the effects, I have noticed that some of the effects listed in Windows are not present in Linux, specifically, in Arrays & Tiles, Loose Photos is missing, and in Artistic, Comic Book and Paint With Brush are missing.

There may be more, but those were just the 3 I noticed first, and was wondering why....

Will these be added to a future update in Linux?

Thanks

Can't install G'Mic (Malware Wacatac.B!ml)

Hello everyone,

I can't install G'MIC due the fact that my virus scanner automatically delete G'MIC installer because it contain the Trojan Wacatac.B!ml malware. It could be a false positive, but i'm kinda sceptical. Just because I need to accept Wacatac.B!ml before I can use the plugin. Which means, if this is a false positive, I still gives my anti-virus the order to ignore this malware.

I also tried the zip version but I can't download it at all. The download just fails.

Can I download a older version through the official website? Because I didn't had this issue a few weeks ago when I installed a older version.

Feature Request: import_glob_text

I would like to have a mixture of import_text and import_glob. Basically, import every files within folder as if it was imported one by one with it command. I think G'MIC is useful for even non-image simple files, hence my asking.

Another idea is to have a option for it command to import all files within current directory. Best approach is to '*' as a possible argument which implies every files within current directory is to be imported. This can also be extended to other input commands I think.

However, I can do this manually with exec to find all the file names within current directory, and use it command, process them with my command, and export them back. As a matter of fact, I pushed a command on gmic-community to aid on that.

It's not the most wanted feature request, and workarounds do exist, but I'll leave this idea to you anyway.

the filter Drawn Montage Gives a preview error

I open a homemade template with basic colors, and some photo's in underlaying layers, then I open the filter "Drawn Montage" in G'Mic.
I get a preview error. It seems something is going wrong in this filter.
I performed the exact same action with the previous version of G'Mic without problems,
I work with Gimp 2.10.34 (revisie2) and the latest stable version of G'Mic 3.3.1. for Windows. A friend with a Linux computer got the same error.

Hereby a screenshot.

Schermafbeelding 2023-11-04 104228

(Feature Request) Need to be able to Cylinderize (like Spherize)

As in title. I've been trying to find a way to edit the Spherize script, but I haven't found such documentation. I think it could be simple to just control the amount of X or Y the Spherize filter is applied, but without looking at the code, I can't determine. It would be great if we could define an axis by clicking and dragging on the preview area, then adjusting the amount of deformation. This is being used to wrap graphics around cylindrical objects (such as a coffee mug).

Feature Request: Permute as a math evaluation function

Inspired by this thread - https://discuss.pixls.us/t/sort-images-according-to-n-sized-channels/40480/5 .

I think it would be a good idea to have permute_xyzc function within the math evaluator. This would allow to treat cropped areas as if they were permute of a image. There can also be inverse_permute_xyzc to make it easy to draw the values back though it's not hard to find the inverse permute xyzc, and I have a custom G'MIC command just to do that.

Minor bug report

I wonder if there's something wrong with parse_cli.

C:\Windows\System32>gmic whatis ratio
[gmic]./ Start G'MIC interpreter (v.3.3.4).
fitratio_wh
poweriteration
rep_nearest_ratio
rep_technorobbo_intense_filtration
resize_ratio2d
[gmic]./ End G'MIC interpreter.

Pretty sure rep_technorobbo_intense_filtration is not part of it nor poweriteration should be there. But, this is just minor bug, not a urgent one.

Feature Request - Add p: current processed position of the associated image

I been working on combinatorics tools recently, and there are things like this:

  axis==2?(
   axis()=z;
  ):
  axis==1?(
   axis()=y;
  ):(
   axis()=x;
  );

In conjunction to this example:

num_of_combinations,axis={permut($2,$1,1)},{_'$3'-_'x'}

So, to simplify this problem, one should have the option to have p. If the end output is a vector, then p would be based on the x,y,z position, otherwise, x,y,z,c.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.