Multiple rotations

CB
Posted By
Captain Blammo
May 31, 2004
Views
1154
Replies
15
Status
Closed
I’ve been trying to take an image and produce 359 rotated versions of it (1 degree increments, of course). However, I just can’t figure out how to automate it. I managed to rotate one image 359 times and save it on top of itself, but that wasn’t so helpful.

I know that I could do it by rotating previous rotations if I kept at it, but that’s a really good way to mess up the image quality. What I really need to do is rotate by 1 degree, save, rotate by 2 degrees, save, rotate by 3 degrees, etc.

Just to clarify, I should have 360 files at the end of the process (including the original).

Any help is greatly appreciated!

Ewan

How to Master Sharpening in Photoshop

Give your photos a professional finish with sharpening in Photoshop. Learn to enhance details, create contrast, and prepare your images for print, web, and social media.

J
john
May 31, 2004
In article <PJJuc.51204$>, "Captain
Blammo" wrote:

I’ve been trying to take an image and produce 359 rotated versions of it (1 degree increments, of course). However, I just can’t figure out how to automate it. I managed to rotate one image 359 times and save it on top of itself, but that wasn’t so helpful.

I know that I could do it by rotating previous rotations if I kept at it, but that’s a really good way to mess up the image quality. What I really need to do is rotate by 1 degree, save, rotate by 2 degrees, save, rotate by 3 degrees, etc.

Just to clarify, I should have 360 files at the end of the process (including the original).

Imageready comes with Photoshop. Try it. There should be an action called "SPIN". It will create a new layer for each interation. Modify as neccessary. (If you have CS you can save each layer as a separate file rather than one big with 360 layers.)
CB
Captain Blammo
May 31, 2004
Imageready comes with Photoshop. Try it. There should be an action called "SPIN". It will create a new layer for each interation. Modify as neccessary. (If you have CS you can save each layer as a separate file rather than one big with 360 layers.)

The "Spin" action seems to be what I’m after, apart from that it spins in the wrong direction, and the angular increments are too large. Also, I couldnt figure out how to save each layer as a file.

Is there no way to use scripting of some sort to do this? I looked for ways to use Photoshop’s tools from the command line, but couldn’t find anything.

Something like this would do the job in an incredibly simple fashion:

for(count=1; count<360; count=count+1)
{
open(picname.psd);
rotate(count);
save(picname + count +, GIF);
close(picname.psd);
}

Is there nothing of the sort available? It seems like an awful waste of time to record an action with me rotating a picture 360 times and saving it.

Ewan
J
john
May 31, 2004
In article <NALuc.51262$>, "Captain
Blammo" wrote:

The "Spin" action seems to be what I’m after, apart from that it spins in the wrong direction, and the angular increments are too large. Also, I couldnt figure out how to save each layer as a file.

Is there no way to use scripting of some sort to do this? I looked for ways to use Photoshop’s tools from the command line, but couldn’t find anything.

It’s my day off so I’m not near my workstation so forgive if I’m not perfectly accurate, but in ImageReady you can change that action to a whatever increment you want, and in any direction you want. To do that, just double-click on the action part named "Angle:" and type in the degrees you want in MINUS degrees for counter-clockwise. For example, instead of 20 type in -20.

Regarding the saving of layers, it’s been covered here. I only got CS an hour before I left work Friday so I can’t swear that it does that (but I’d bet a beer it does, possibly under an ‘export’ menu item), and regardless you can download a trial of a program that does exactly that via drag-n-drop here: http://www.metadma.com/LayerSplitter.html

Sometimes it’s okay to drop the compulsion to program and to do with what you have when the outcome is adequate. Or read the documentation. RTFM!

It took me longer to type the above than to cut the ImageReady adjustments neccessary to do what you need to do. But for the program-compulsive, this is the outcome. Use a text editing macro. Knock yourself out.

// Action file – Generated by Adobe ImageReady 2.0
// ============================================================ =============== {
action = new Action("Spin");
action.expanded = true;
action.runInBackground = false;
action.saveSource = false;
action.saveTarget = true;
action.targetLocation = tlSourceFolder;
action.dupFileNameBehavior = dfnAdd2Digits;
action.windowsFileNaming = true;
action.macFileNaming = true;
action.unixFileNaming = true;
action.displayImages = false;
action.pauseBeforeSave = false;
action.errorBehavior = dfnOverwriteConfirm;
action.version = 2;

step1 = new CopyLayerSet;
step1.enabled = true;
step1.doDialog = false;
step1.expanded = false;
action.AddStep(step1);

step2 = new LayerVisibility;
step2.enabled = true;
step2.doDialog = false;
step2.expanded = false;
step2.visible = false;
step2.toggleOthers = false;
action.AddStep(step2);

step3 = new DuplicateLayer;
step3.enabled = true;
step3.doDialog = false;
step3.expanded = false;
action.AddStep(step3);

step4 = new LayerVisibility;
step4.enabled = true;
step4.doDialog = false;
step4.expanded = false;
step4.visible = true;
step4.toggleOthers = false;
action.AddStep(step4);

step5 = new TransformLayer;
step5.enabled = true;
step5.doDialog = false;
step5.expanded = false;
step5.positionX = 0.000000;
step5.positionY = 0.000000;
step5.positionMode = ePositionRelative;
step5.percentage = 1.000000;
step5.horzSkew = 0.000000;
step5.vertSkew = 0.000000;
step5.rotation = 30.000000;
action.AddStep(step5);

step6 = new CopyLayerSet;
step6.enabled = true;
step6.doDialog = false;
step6.expanded = false;
action.AddStep(step6);

step7 = new LayerVisibility;
step7.enabled = true;
step7.doDialog = false;
step7.expanded = false;
step7.visible = false;
step7.toggleOthers = false;
action.AddStep(step7);

step8 = new SelectBackwardLayer;
step8.enabled = true;
step8.doDialog = false;
step8.expanded = false;
action.AddStep(step8);

step9 = new DuplicateLayer;
step9.enabled = true;
step9.doDialog = false;
step9.expanded = false;
action.AddStep(step9);

step10 = new LayerVisibility;
step10.enabled = true;
step10.doDialog = false;
step10.expanded = false;
step10.visible = true;
step10.toggleOthers = false;
action.AddStep(step10);

step11 = new TransformLayer;
step11.enabled = true;
step11.doDialog = false;
step11.expanded = true;
step11.positionX = 0.000000;
step11.positionY = 0.000000;
step11.positionMode = ePositionRelative;
step11.percentage = 1.000000;
step11.horzSkew = 0.000000;
step11.vertSkew = 0.000000;
step11.rotation = 60.000000;
action.AddStep(step11);

step12 = new CopyLayerSet;
step12.enabled = true;
step12.doDialog = false;
step12.expanded = false;
action.AddStep(step12);

step13 = new LayerVisibility;
step13.enabled = true;
step13.doDialog = false;
step13.expanded = false;
step13.visible = false;
step13.toggleOthers = false;
action.AddStep(step13);

step14 = new SelectBackwardLayer;
step14.enabled = true;
step14.doDialog = false;
step14.expanded = false;
action.AddStep(step14);

step15 = new DuplicateLayer;
step15.enabled = true;
step15.doDialog = false;
step15.expanded = false;
action.AddStep(step15);

step16 = new LayerVisibility;
step16.enabled = true;
step16.doDialog = false;
step16.expanded = false;
step16.visible = true;
step16.toggleOthers = false;
action.AddStep(step16);

step17 = new TransformLayer;
step17.enabled = true;
step17.doDialog = false;
step17.expanded = false;
step17.positionX = 0.000000;
step17.positionY = 0.000000;
step17.positionMode = ePositionRelative;
step17.percentage = 1.000000;
step17.horzSkew = 0.000000;
step17.vertSkew = 0.000000;
step17.rotation = 90.000000;
action.AddStep(step17);

step18 = new CopyLayerSet;
step18.enabled = true;
step18.doDialog = false;
step18.expanded = false;
action.AddStep(step18);

step19 = new LayerVisibility;
step19.enabled = true;
step19.doDialog = false;
step19.expanded = false;
step19.visible = false;
step19.toggleOthers = false;
action.AddStep(step19);

step20 = new SelectBackwardLayer;
step20.enabled = true;
step20.doDialog = false;
step20.expanded = false;
action.AddStep(step20);

step21 = new DuplicateLayer;
step21.enabled = true;
step21.doDialog = false;
step21.expanded = false;
action.AddStep(step21);

step22 = new LayerVisibility;
step22.enabled = true;
step22.doDialog = false;
step22.expanded = false;
step22.visible = true;
step22.toggleOthers = false;
action.AddStep(step22);

step23 = new TransformLayer;
step23.enabled = true;
step23.doDialog = false;
step23.expanded = false;
step23.positionX = 0.000000;
step23.positionY = 0.000000;
step23.positionMode = ePositionRelative;
step23.percentage = 1.000000;
step23.horzSkew = 0.000000;
step23.vertSkew = 0.000000;
step23.rotation = 120.000000;
action.AddStep(step23);

step24 = new CopyLayerSet;
step24.enabled = true;
step24.doDialog = false;
step24.expanded = false;
action.AddStep(step24);

step25 = new LayerVisibility;
step25.enabled = true;
step25.doDialog = false;
step25.expanded = false;
step25.visible = false;
step25.toggleOthers = false;
action.AddStep(step25);

step26 = new SelectBackwardLayer;
step26.enabled = true;
step26.doDialog = false;
step26.expanded = false;
action.AddStep(step26);

step27 = new DuplicateLayer;
step27.enabled = true;
step27.doDialog = false;
step27.expanded = false;
action.AddStep(step27);

step28 = new LayerVisibility;
step28.enabled = true;
step28.doDialog = false;
step28.expanded = false;
step28.visible = true;
step28.toggleOthers = false;
action.AddStep(step28);

step29 = new TransformLayer;
step29.enabled = true;
step29.doDialog = false;
step29.expanded = false;
step29.positionX = 0.000000;
step29.positionY = 0.000000;
step29.positionMode = ePositionRelative;
step29.percentage = 1.000000;
step29.horzSkew = 0.000000;
step29.vertSkew = 0.000000;
step29.rotation = 150.000000;
action.AddStep(step29);

step30 = new CopyLayerSet;
step30.enabled = true;
step30.doDialog = false;
step30.expanded = false;
action.AddStep(step30);

step31 = new LayerVisibility;
step31.enabled = true;
step31.doDialog = false;
step31.expanded = false;
step31.visible = false;
step31.toggleOthers = false;
action.AddStep(step31);

step32 = new SelectBackwardLayer;
step32.enabled = true;
step32.doDialog = false;
step32.expanded = false;
action.AddStep(step32);

step33 = new DuplicateLayer;
step33.enabled = true;
step33.doDialog = false;
step33.expanded = false;
action.AddStep(step33);

step34 = new LayerVisibility;
step34.enabled = true;
step34.doDialog = false;
step34.expanded = false;
step34.visible = true;
step34.toggleOthers = false;
action.AddStep(step34);

step35 = new TransformLayer;
step35.enabled = true;
step35.doDialog = false;
step35.expanded = false;
step35.positionX = 0.000000;
step35.positionY = 0.000000;
step35.positionMode = ePositionRelative;
step35.percentage = 1.000000;
step35.horzSkew = 0.000000;
step35.vertSkew = 0.000000;
step35.rotation = 180.000000;
action.AddStep(step35);

step36 = new CopyLayerSet;
step36.enabled = true;
step36.doDialog = false;
step36.expanded = false;
action.AddStep(step36);

step37 = new LayerVisibility;
step37.enabled = true;
step37.doDialog = false;
step37.expanded = false;
step37.visible = false;
step37.toggleOthers = false;
action.AddStep(step37);

step38 = new SelectBackwardLayer;
step38.enabled = true;
step38.doDialog = false;
step38.expanded = false;
action.AddStep(step38);

step39 = new DuplicateLayer;
step39.enabled = true;
step39.doDialog = false;
step39.expanded = false;
action.AddStep(step39);

step40 = new LayerVisibility;
step40.enabled = true;
step40.doDialog = false;
step40.expanded = false;
step40.visible = true;
step40.toggleOthers = false;
action.AddStep(step40);

step41 = new TransformLayer;
step41.enabled = true;
step41.doDialog = false;
step41.expanded = false;
step41.positionX = 0.000000;
step41.positionY = 0.000000;
step41.positionMode = ePositionRelative;
step41.percentage = 1.000000;
step41.horzSkew = 0.000000;
step41.vertSkew = 0.000000;
step41.rotation = 210.000000;
action.AddStep(step41);

step42 = new CopyLayerSet;
step42.enabled = true;
step42.doDialog = false;
step42.expanded = false;
action.AddStep(step42);

step43 = new LayerVisibility;
step43.enabled = true;
step43.doDialog = false;
step43.expanded = false;
step43.visible = false;
step43.toggleOthers = false;
action.AddStep(step43);

step44 = new SelectBackwardLayer;
step44.enabled = true;
step44.doDialog = false;
step44.expanded = false;
action.AddStep(step44);

step45 = new DuplicateLayer;
step45.enabled = true;
step45.doDialog = false;
step45.expanded = false;
action.AddStep(step45);

step46 = new LayerVisibility;
step46.enabled = true;
step46.doDialog = false;
step46.expanded = false;
step46.visible = true;
step46.toggleOthers = false;
action.AddStep(step46);

step47 = new TransformLayer;
step47.enabled = true;
step47.doDialog = false;
step47.expanded = false;
step47.positionX = 0.000000;
step47.positionY = 0.000000;
step47.positionMode = ePositionRelative;
step47.percentage = 1.000000;
step47.horzSkew = 0.000000;
step47.vertSkew = 0.000000;
step47.rotation = 240.000000;
action.AddStep(step47);

step48 = new CopyLayerSet;
step48.enabled = true;
step48.doDialog = false;
step48.expanded = false;
action.AddStep(step48);

step49 = new LayerVisibility;
step49.enabled = true;
step49.doDialog = false;
step49.expanded = false;
step49.visible = false;
step49.toggleOthers = false;
action.AddStep(step49);

step50 = new SelectBackwardLayer;
step50.enabled = true;
step50.doDialog = false;
step50.expanded = false;
action.AddStep(step50);

step51 = new DuplicateLayer;
step51.enabled = true;
step51.doDialog = false;
step51.expanded = false;
action.AddStep(step51);

step52 = new LayerVisibility;
step52.enabled = true;
step52.doDialog = false;
step52.expanded = false;
step52.visible = true;
step52.toggleOthers = false;
action.AddStep(step52);

step53 = new TransformLayer;
step53.enabled = true;
step53.doDialog = false;
step53.expanded = false;
step53.positionX = 0.000000;
step53.positionY = 0.000000;
step53.positionMode = ePositionRelative;
step53.percentage = 1.000000;
step53.horzSkew = 0.000000;
step53.vertSkew = 0.000000;
step53.rotation = 270.000000;
action.AddStep(step53);

step54 = new CopyLayerSet;
step54.enabled = true;
step54.doDialog = false;
step54.expanded = false;
action.AddStep(step54);

step55 = new LayerVisibility;
step55.enabled = true;
step55.doDialog = false;
step55.expanded = false;
step55.visible = false;
step55.toggleOthers = false;
action.AddStep(step55);

step56 = new SelectBackwardLayer;
step56.enabled = true;
step56.doDialog = false;
step56.expanded = false;
action.AddStep(step56);

step57 = new DuplicateLayer;
step57.enabled = true;
step57.doDialog = false;
step57.expanded = false;
action.AddStep(step57);

step58 = new LayerVisibility;
step58.enabled = true;
step58.doDialog = false;
step58.expanded = false;
step58.visible = true;
step58.toggleOthers = false;
action.AddStep(step58);

step59 = new TransformLayer;
step59.enabled = true;
step59.doDialog = false;
step59.expanded = false;
step59.positionX = 0.000000;
step59.positionY = 0.000000;
step59.positionMode = ePositionRelative;
step59.percentage = 1.000000;
step59.horzSkew = 0.000000;
step59.vertSkew = 0.000000;
step59.rotation = 300.000000;
action.AddStep(step59);

step60 = new CopyLayerSet;
step60.enabled = true;
step60.doDialog = false;
step60.expanded = false;
action.AddStep(step60);

step61 = new LayerVisibility;
step61.enabled = true;
step61.doDialog = false;
step61.expanded = false;
step61.visible = false;
step61.toggleOthers = false;
action.AddStep(step61);

step62 = new SelectBackwardLayer;
step62.enabled = true;
step62.doDialog = false;
step62.expanded = false;
action.AddStep(step62);

step63 = new DuplicateLayer;
step63.enabled = true;
step63.doDialog = false;
step63.expanded = false;
action.AddStep(step63);

step64 = new LayerVisibility;
step64.enabled = true;
step64.doDialog = false;
step64.expanded = false;
step64.visible = true;
step64.toggleOthers = false;
action.AddStep(step64);

step65 = new TransformLayer;
step65.enabled = true;
step65.doDialog = false;
step65.expanded = false;
step65.positionX = 0.000000;
step65.positionY = 0.000000;
step65.positionMode = ePositionRelative;
step65.percentage = 1.000000;
step65.horzSkew = 0.000000;
step65.vertSkew = 0.000000;
step65.rotation = 330.000000;
action.AddStep(step65);

step66 = new GoToNextFrame;
step66.enabled = true;
step66.doDialog = false;
step66.expanded = false;
action.AddStep(step66);
J
john
May 31, 2004
Don’t use the long ‘script’ I posted. It was floating around on my home Mac and I can’t swear by it. Just change the action in ImageReady itself. First dupkcate it, then modify the duplicate. Click and type. Easy, quick and foolproof.
CG
Colin G Edwards
Jun 1, 2004
Is there no way to use scripting of some sort to do this? I looked for ways to use Photoshop’s tools from the command line, but couldn’t find anything.

Something like this would do the job in an incredibly simple fashion:
for(count=1; count<360; count=count+1)
{
open(picname.psd);
rotate(count);
save(picname + count +, GIF);
close(picname.psd);
}

Is there nothing of the sort available? It seems like an awful waste of time to record an action with me rotating a picture 360 times and saving it.

It may be sacriliedge in this newsgroup, but sometimes Photoshop isn’t the best tool for image manipulation. <Gasps, then the house falls silent…> Hey, it’s a rare occurence, but it happens!

For scripting jobs, which this clearly is, it’s often simpler to use a scripting language with tools which are designed to be used from script. If you have Imagemagick on your system (http://www.imagemagick.org/) you can use its excellent ‘mogrify’ command to do this from Python:

#!/usr/bin/python

from shutil import copy
from os import system

for deg in range(1,360):
srcfile = "camp.jpg"
destfile = "camp_%03d.jpg" % deg
copy( srcfile, destfile )
system( "mogrify -rotate %d %s" % (deg, destfile) )

Given a file called camp.jpg (which I happen to have on my system) that does exactly what you want. Imagemagick and Python (Perl, Tcl, Java, whatever) run on Win32, Mac9/X and UNIX. This script was tested on Linux, but it’ll probably work unchanged on Win32 or Mac.
J
john
Jun 1, 2004
In article <40bbd301$0$8120$>, Derek
Fountain wrote:

It may be sacriliedge in this newsgroup, but sometimes Photoshop isn’t the best tool for image manipulation. <Gasps, then the house falls silent…> Hey, it’s a rare occurence, but it happens!

It’s not a sacrilege at all. A high-end program invites high-end expectations from professionals.

For scripting jobs, which this clearly is [… snip interesting tip…]

But the job in question need not be scripted. I think that’s the point. The OP was shooting first, asking questions later. He did not understand what PS can do in the first place and demanded that somehow it read his (programmer) mind rather than him reading the docs.
CB
Captain Blammo
Jun 1, 2004
Regarding the saving of layers, it’s been covered here. I only got CS an hour before I left work Friday so I can’t swear that it does that (but I’d bet a beer it does, possibly under an ‘export’ menu item), and regardless you can download a trial of a program that does exactly that via drag-n-drop here: http://www.metadma.com/LayerSplitter.html

Sorry, I should have mentioned that I’m using photoshop 7.0, not CS. It won’t even run on win98 🙂

Sometimes it’s okay to drop the compulsion to program and to do with what you have when the outcome is adequate. Or read the documentation. RTFM!

If I had the compulsion to program, I would’ve been using scripting from the beginning, it’s just that the program didn’t do what I wanted it to. Trust me, I R’d T F’ing M, and couldn’t find anything helpful at all. After wasting enough time on a task, one naturally turns to other solutions.

I tried changing values for the action, but all I could find was a series of rotations that I would have had to change individually, not to mention adding more of them. There was no "angle" setting. In any case, thank you for pointing out that such a thing as an action file actually exists, because they didn’t seem to be mentioned in the help file.

I note that the action files for Photoshop can’t be read as text, unlike the Imageready ones. What do I need to view/edit them?

Thanks for the help.

Ewan
CB
Captain Blammo
Jun 1, 2004
It may be sacriliedge in this newsgroup, but sometimes Photoshop isn’t the best tool for image manipulation. <Gasps, then the house falls silent…> Hey, it’s a rare occurence, but it happens!

I must say that it came as a bit of a suprise to me when I realised it wasn’t the right tool for the job 🙂

For scripting jobs, which this clearly is, it’s often simpler to use a scripting language with tools which are designed to be used from script.
If
you have Imagemagick on your system (http://www.imagemagick.org/) you can use its excellent ‘mogrify’ command to do this from Python:
<snip script>

Ah, marvellous! Worked like a charm. I appreciate the script too, as I’ve never used either Python or Imagemagick before. Would I be right in thinking that I could also use mogrify from within shell scripts?

Thanks very much!

Ewan
J
john
Jun 1, 2004
In article <Lq4vc.51775$>, "Captain
Blammo" wrote:

Regarding the saving of layers, it’s been covered here. I only got CS an hour before I left work Friday so I can’t swear that it does that (but I’d bet a beer it does, possibly under an ‘export’ menu item), and regardless you can download a trial of a program that does exactly that via drag-n-drop here: http://www.metadma.com/LayerSplitter.html

I tried changing values for the action, but all I could find was a series of rotations that I would have had to change individually, not to mention adding more of them. There was no "angle" setting.

Of course there was an "angle:" setting. It’s in the ‘transform current layer’ part of the action. There are not so many that changing them is a burden. Sorry if you find that too much trouble to find.
CB
Captain Blammo
Jun 2, 2004
I tried changing values for the action, but all I could find was a
series of
rotations that I would have had to change individually, not to mention adding more of them. There was no "angle" setting.

Of course there was an "angle:" setting. It’s in the ‘transform current layer’ part of the action. There are not so many that changing them is a burden. Sorry if you find that too much trouble to find.

I consider 360 angle changes, not to mention subsequent changes if I want to change the increments, to be very much not worth it next to a 7 line script that can be changed in seconds.

I’m sorry if my laziness offends you, but I was never the kind for repetitive and unnecessary tasks. I did get the point; I know it could be done in Imageready, but I don’t think the program was too upset about me using something a bit more streamlined for the purpose.

Ewan
J
john
Jun 2, 2004
In article <pFavc.52088$>, "Captain
Blammo" wrote:

I consider 360 angle changes, not to mention subsequent changes if I want to change the increments, to be very much not worth it next to a 7 line script that can be changed in seconds.

Yer just a whiner. If you wanted the output, you would just do it.
CB
Captain Blammo
Jun 2, 2004
I consider 360 angle changes, not to mention subsequent changes if I
want to
change the increments, to be very much not worth it next to a 7 line
script
that can be changed in seconds.

Yer just a whiner. If you wanted the output, you would just do it.

Um, I did. In 5 minutes, using the *other* way.

Ewan
J
john
Jun 2, 2004
In article <QQavc.52100$>, "Captain
Blammo" wrote:

I consider 360 angle changes, not to mention subsequent changes if I
want to
change the increments, to be very much not worth it next to a 7 line
script
that can be changed in seconds.

Yer just a whiner. If you wanted the output, you would just do it.

Um, I did. In 5 minutes, using the *other* way.

Um, well I’m just a whiner, I guess.
CB
Captain Blammo
Jun 2, 2004
Yer just a whiner. If you wanted the output, you would just do it.

Um, I did. In 5 minutes, using the *other* way.

Um, well I’m just a whiner, I guess.

Man, we should team up and whine about something in tandem. Just think of what we could accomplish………

Ewan
CG
Colin G Edwards
Jun 2, 2004
Ah, marvellous! Worked like a charm. I appreciate the script too, as I’ve never used either Python or Imagemagick before. Would I be right in thinking that I could also use mogrify from within shell scripts?

Yes, of course. Most people use command line tools like mogrify from shell, at least under *nix. I happened to use Python for that example because I’ve been working with Python recently and it came most naturally. Normally I’d use Perl. :o)

MacBook Pro 16” Mockups 🔥

– in 4 materials (clay versions included)

– 12 scenes

– 48 MacBook Pro 16″ mockups

– 6000 x 4500 px

Related Discussion Topics

Nice and short text about related topics in discussion sections