Plugin development - RGB picture

Scripts and programs to automate Astroart
Post Reply
nmac
Posts: 12
Joined: 15 Jan 2019, 14:53

Plugin development - RGB picture

Post by nmac » 19 Jul 2022, 11:45

Hi!
I am been trying to develop plugins for some functions I miss on AstroArt (SCNR, ArcSinStretch, HyperBolicStretch and others).
I know there is already a "Attenuate one color" function but the SCNR script port I made is more effective (neutral) removing the color cast
even messing around with the other options (Strength, Level and Range). Let's use it as an example:

-----------------------------------------------------------------------------------------------------------------------------------
Image.PrepareUndo

REM Average Neutral Protection
REM m = 0.5×(R + B)
REM G = Min( G, m )

x1 = 0
y1 = 0
x2 = Image.Width
y2 = Image.Height

for y = y1 to y2
for x = x1 to x2
r = Image.GetPixelR(x,y)
g = Image.GetPixelG(x,y)
b = Image.GetPixelB(x,y)
m = 0.5 * (r + b)
newg = min (g, m)
Image.SetPixel(x, y, r, newg, b)
next x
next y

Image.Update

function Min (value1,value2)
if value1 < value2 then return value1 else return value2
end function

-----------------------------------------------------------------------------------------------------------------------------------

The thing is that the script is slow (20s to execute on i3 10100F/32G ram/NVME) so I would like to convert it to a plugin so it can execute faster
and add some GUI elements. I have already looked at the SDK sources (I am using lazarus) and compiled a 64bit version of the demo plugin with
sucess and use it in AA8.

The problem is that based on the demo code, I can only work with the ac_getbuffer function wich only gets one plane of image. Is there any other
function that works like the script and gives you the 3 channel RGB image instead of only one plane? Maybe ac_getimage (selection, nil, nil) ?
I am bit lost here even looking at the information provided. Are there any detailed examples of the SDK funcions?
So resuming, how can I convert this script to a plugin using the Lazarus code of the SDK?

Thank you and Regards
Nuno Carregueira

fabdev
Posts: 461
Joined: 03 Dec 2018, 21:43

Re: Plugin development - RGB picture

Post by fabdev » 19 Jul 2022, 12:41

Hello, the documentation for the plugin SDK, is inside the folder "Generic_plugin", file: Plugins.htm. There are instructions about getting the R,G,B color planes using ac_getbuffer(). For example, from the Lazarus example:

callback(ac_getbuffer, pimage, @buffer, pointer(PCGREEN))

just add:
callback(ac_getbuffer, pimage, @bufferR, pointer(PCRED))
callback(ac_getbuffer, pimage, @bufferB, pointer(PCBLUE))

Greetings,
Fabio.

nmac
Posts: 12
Joined: 15 Jan 2019, 14:53

Re: Plugin development - RGB picture

Post by nmac » 19 Jul 2022, 13:11

Hi Fabio,
thanks for the quick answering I will try that.
Regards

Nuno

fabdev
Posts: 461
Joined: 03 Dec 2018, 21:43

Re: Plugin development - RGB picture

Post by fabdev » 19 Jul 2022, 14:21

Hi Nuno, OK, meanwhile a faster script can be obtained using a Formula:

Image.PrepareUndo
f = "vr : If(0.5*(vr+vb)<vg, 0.5*(vr+vb), vg) : vb"
Image.Formula(f)
Image.Update

It will be faster than a script code, but still slower than a real plugin.

The same formula can be used to create a direct command:

nmac
Posts: 12
Joined: 15 Jan 2019, 14:53

Re: Plugin development - RGB picture

Post by nmac » 19 Jul 2022, 14:39

Wow, that really shows the power of the formula function.
Thanks for sharing. Meawhile the plugin is already fully working. Blazing fast, instant execution :-)
I just need to add some GUI options to control the amount applied.
Again, thanks for your help.

Regards,
Nuno

nmac
Posts: 12
Joined: 15 Jan 2019, 14:53

Re: Plugin development - RGB picture

Post by nmac » 28 Jul 2022, 12:14

Hi Fabio,
continuing the plugin quest I got another problem.

How can I parse the fits header from the sdk in pascal. That would be important because I need to change
the plugin behaviour on mono and color images along another parameters.

I know that this has to do with basic pointer management, but I am having trouble trying to use the AC_READHEADER function. I can get the pheader pointer (nativeint) but I cant get
the null terminated string parsed. Do you have any examples of this? I am sorry to ask but I have no sdk examples to rely on.

Regards
Nuno

Post Reply