Jump to content


  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by LWChris

  1. Btw, I loved your idea so much, I created an image using the portal I made. I used my "Modify Channels" plugin to "isolate" the portal so I could put in another image inside it. First, you may want to use "Effects > Distort > Dents..." on the "disk" layer to give the outer edge a little "flaming" look. Maybe duplicate that layer and give it a beefy Gaussian Blur with a huge radius for a "halo" effect. Then on the other layer again, apply slight Zoom Blur. Finally, apply "Dents..." with low "Tension" on the two black spike layers for a more "smokey" appearance. Finally, merge all layers onto a black background: Then find my plugin under "Adjustments > Modify Channels...". Using two steps "Alpha = Identity Average" and then "Grayscale = Constant 255", you will isolate the portal. Together with two beautiful stock images from pexels (Road, Countryside), I created this:
  2. I can think of some other idea: Get the "Light Rays" plugin by MadJik (download link and installation guide in first post; don't forget to restart Paint.NET) Create a new, square image, and clear the white background Select white as primary color Create a white disk (aka filled circle w/o outline) in the middle Create a second layer above the one with the disk Select black as primary and secondary color, but set the secondary color to fully transparent Open the plugin dialog from "Effects > Texture > Light Rays...", and adjust the settings: Disable the "Use anti-aliasing" (it renders faster now and we'll blur the layer in the end anyway) Enable "Use random" Set "Reseed" from 1 to 0 (this will be important later) Set "Random factor" to 80 (the rays will now have their ends slanted) Set "Ratio of the rays" from 0 to 100 (don't worry if it looks chunky for now) Reduce the "Radius External" slider from "100" to a number so that even the rays reaching out the furthest still don't touch the disk's edge, effectively leaving the "white ring". Adjust the slider so that you're satisfied with the thickness of that ring. Memorize that number, but reduce it by about a quarter for now (so 40 becomes 30 for example). Set "Quantity of rays" from 50 to several hundred, depending on your image size. The larger the image, the greater the number of rays to make them "fine". Confirm Repeat the effect a few times, until there are just a few white dotted lines remaining in the center. Don't repeat it too often though, or the outer edge will lose its spiky appearance. Rather undo then re-apply (Ctrl+Z, Ctrl+F) the effect several times for other Using a wide black brush, paint out the most obvious white lines from the inner area that shall become pure blackness. Open "Effects > Blurs > Zoom Blur..." and set the Zoom Amount to 100 (this is why we reduced the external radius by 25% in step 7.6) Add a third layer Open "Effects > Texture > Light Rays..." again This time, select the actual external radius you memorized earlier (e. g. the 40) Repeat the effect several times again Use "Effects > Blurs > Zoom Blur..." once more, but this time with the default "Zoom Amount" of 10 You may want to try out other effects from the "Blurs" menu as well. Fragments with a high "Fragment Count" (see 2nd image) and/or "Unfocus" on "Radius" 1 work very well, too. Try around and take what pleases your aesthetics. My results (black background added for better visibility):
  3. Yes, I sometimes do that as well when it is a lot of layers, because this approach requires less switching of layers. I still have to "dump" my currently mixed color on a temporary layer though. I suggested adding a new keyboard shortcut, because introducing a shortcut "Shift+Del" that currently is not doing anything different from pressing "Del" alone is the least invasive change, especially since all it does is NOT doing a second step, so it is in a way "less destructive". So even persons who would for some reason use "Shift+Del" right now all the time would not be disturbed because it doesn't make something they used to do impossible. Another idea would be to make "Del" consist out of two steps in the history, "Delete" first, "Deselect" second so I could Ctrl+Z to get the selection back. This is the same behavior that is already used when you press Ctrl+D while drawing a line or shape within a selection. It commits the drawing, then deselects. In this case "Del, Ctrl+Z" would be my chord to "Delete and retain selection". I'm absolutely fine with that, too.
  4. Quite often I need to delete the same area on multiple layers. Currently, I always have to use a trick: make the selection, add a temporary layer and flood fill the selection as "mask", then delete on the first layer, switch to the mask, magic-wand-select it to "restore" the original selection, switch back to the second layer, delete there, and so on... That is only necessary because when you delete a selection, not only is the selected area cleared, it is also deselected. It would be really cool to have an option to retain the selection upon deletion by holding Shift to indicate that you want to delete multiple times so you need to retain the selection after clearing the content.
  5. Can't reproduce this on my machine. Chosing black primary color and orange semi transparent secondary color in a new document, I can draw any shape (tested several) with any of the three modes and it works as expected. Also, toggling the mode before finishing with Enter (or Ctrl+D for that matter) works. Can you confirm your problem in a new image with a new layer? Maybe you had some special settings such as a special mix mode for the layer or the tool and didn't realize it coincidentially produces your secondary color anyway.
  6. It's not only Chrome. It's also the hotkey in Firefox, Edge and Chrome-alike browsers such as Vivaldi. Chances are even your browser uses it.
  7. Not the biggest fan of the new icons tbh, but I see why they are necessary (and it's not your icons in particular, it's more that I dislike the "plain" style in general, it looks crude to me). The only thing I have to criticize is when you did not only change the style but also the symbol itself (e. g. when closing an unsaved document, I'm pretty sure there used to be a red cross, not a bin and an arrow). That makes getting used to the new theme more difficult than necessary. Otherwise I guess I'll get used to it. As long as you don't make the mistake of going monochrome like Microsoft did with Office and Visual Studio 2013... that was the biggest fail after SCREAMING ribbon tab headers. 😂 Thanks for the layer rotation, now I just need the 90° rotations, too, and I'm happy (rotation zoom is lossy somehow).
  8. I understand that in general for hotkeys. You wouln't want to assign "Reset to default colors" to the "Delete" key (as in deleting your custom color choices), when the same key triggers a destructive action for other parts of the program. But I think it's okay for mouse actions on totally different areas of the GUI. Also You cannot expect the same thing to happen, since you can neither "close a layer", nor "hide an open file". The action that is closest to "closing a layer" is hiding it - which would happen. The action that is closest to "hiding an open file" is closing it - which already happens. So I think it fits in the greater scheme of understanding. Thank you. I get there are more important things (like maybe updating the "Popular Feature Requests" thread? *hint* ). I hope it'll be in soon nevertheless since it's just an event binding to add.
  9. Well, middle click as a shortcut to close tabs is quite common, but I don't see how that would contradict using middle click on other UI elements with a different action. Currently, middle click behaves like left click. I'm not sure this will look very well. And no matter how big it will become, it will necessarily always be a lot smaller than the whole layer item. Also, the clickable area is already taller than the checkbox, but every time I try to very quickly toggle many layers in a row, about half of the time I activate the layer instead of hiding it. It actually may be an UI issue with the click event being routed to the wrong element for inactive and/or invisible layers, but it's hard to tell for me whether I nailed the click or am just a few pixels off when doing it fastly in a row for 10+ layers.
  10. It's a bit cumbersome to quickly toggle the visibility for many layers, because the checkbox is quite small. Nowadays where most computer mice have a middle button, how about defining middle click on a layer in the Layers tool window toggles the visiblity? This greatly increases the "hit box" for this. Thanks 😁
  11. As most people know, F5, F6, F7 and F8 hide/show the four tool windows. So how about making F9 and F10 preview keys? Pressing F9 only hides all currently visible tool windows while pressed (i. e. if you release the key they come back), so you can get a full view of the image part you're working on. Much like the spacebar temporarily enables the pan tool for as long as you hold it. F10 could be a full-on "preview". It could do the same like F9, but additionally reset the zoom to "fit canvas to screen", hide any selection, handles and cursors, and disable the pixel grid. So when you are currently zoomed in to a certain part of the image you are working on, with your tool windows flying around, simply holding F10 would enable you to get an overview over the full final image, but once you release the key, everything is back to where it was and you can pickup the editing where you left without having to manually toggle all the tool windows and hitting Ctrl+B and then later on restoring the zoom level.
  12. Rick, this feature request is about adding a function to save the list of opened images to a session file and restoring that session again. He named his various use cases to illustrate when he could use that feature. Discussing whether the use cases can be circumvented by buying a new PC or setting up a different OS configuration is not the point here. Session files could be useful in many more cases.
  13. Quite often I use the color picker tool but accidentially click with the wrong button and override the wrong color. It would be cool if I could Ctrl+Z that.
  14. If you are not too worried about making the absolutely best possible decision between which eventual color a blended pixel becomes, the method I'd use is: Select the color picker. Select a pixel from the middle of a color plane, say, the yellow one. Select the magic wand selection tool. Select a pixel in the middle of the color plane again. Adjust the Tolerance level, until you feel satisfied with which pixels will become yellow and which should remain for the adjacent colors. Press Backspace to fill all selected pixels with the primary color. You can also use the color separation (Ctrl+Shift+P) for a first reduction, too. You will probably not find a setting that immediately splits the blended edges perfectly, because if you have three colors, you'll have to allow 3 different values for red, green and blue, and therefore allow 9 colors overall, but it's quite a reduction from the original set of possible colors.
  15. Hello @Pixey, I know that Paint.NET tries to "help" by selecting the next-best visible layer when I delete layers or when the change I made in the layer properties was hiding the layer. What my reproduction steps were meant to show that this behaviour introduces a consistency issue, for example when you rename layers. Even worse is the fact that it doesn't happen when you change nothing in the properties dialogue and because it decides "Nothing to do here" and also skip the check. That means it's very confusing at times. It does not change when you unhide the layer It does change when you hide the layer It does not change when you change properties for a visible layer It does change when you change properties for a hidden layer It does not change when change nothing for a visible layer It ALSO does not change when you change nothing for a hidden layer The use case that happened to me was that I wanted to rename a hidden layer. I selected the layer in the Layers window, I pressed F4, typed the new name, noticed a typo but my right hand was too fast pressing "Enter". So I pressed F4 again, and suddenly the name was completely different. It took me a while to notice the layer had changed to the next visible one below. I did not expect "Rename" to change the active layer, because I have not actively been messing with layers or their visibilty.
  16. My universal key to remove "everything with handles" is "Ctrl+D". It is mapped to Deselect, but it works for selections, gradients, text, lines and shapes. "Esc" works for everything BUT selections.
  17. Changing the layer properties of a hidden layer changes the active layer after confirming the properties window. Open a new image; it has one layer (Background) Ctrl+Shift+N - Add a second layer (Layer 2); Layer 2 gets activated Ctrl+Shift+N - Add a third layer (Layer 3); Layer 3 gets activated Hide Layer 2 by clicking on the checkbox in the Layers window; Layer 3 remains activated F4 - Open layer properties for Layer 3 Change something except for visibility; confirm; Layer 3 remains activated Activate Layer 2 F4 - Open layer properties for Layer 2 Change nothing, but confirm; Layer 2 remains activated F4 - Open layer properties for Layer 2 again Change something except for visibility; confirm; Expected result: Layer 2 remains activated; Result: Background gets activated paint.net v4.0.21 (Final 4.21.6589.7045)
  18. I'm a programmer. People always say they can tell from the looks. This made me think...
  19. This is what I ended up with using the built-in Rotation Zoom as a template and then drawing it by hand using straight lines and gradients...
  20. This looks a bit more like it, but I think for the thickness I want the grid lines to have, and for the number of lines I need, it would end up being more work using this tool than simply drawing them myself; especially, since I need the "horizontal" lines as well, anyway...
  21. Hi Pixey, I think "Tilt Shift" is for the other way round. If I got an image with an perspective grid in it, I can tilt shift it to "remove" the vanishing point or making it appear like a really far away point. Thus it looks as if the image would just cover a really small field of view, thus giving the viewer the impression of a miniature land being photographed. Really nice footage for understanding this effect is the unofficial video for deadmau5's track "71c" on YouTube. Thanks for the reply, but alas, that's not the plugin I am looking for.
  22. Hi, has anybody a tip how to create a perspective grid laying in the ground? I tried to graw a normal grid and then skew it using the "Rotation Zoom", but the quality of the result is really lacking due to the extreme angle, and the fine lines on the left and right parts of the image are just single dots instead of a faded line, because Paint.NET naturally does not understand the continuous nature of lines and rather relocates single pixels to very far locations until they are so faint they disappear, leaving gaps in the lines. To see what I mean, use the following steps: Open a new image, default resolution will do. Create a second layer. On that layer, draw vertical, 1px wide black line in the 25th column. Copy that line and translate it by 50px (Ctrl+Right x5). Repeat that until you filled the whole image. Now skew the layer using the "Rotation Zoom" with these settings: 0.00 / -90.00 / 89.00 /// 0.00 / 0.40 /// 1.35 / True / False I now used that output to draw the lines by hand, using the dots merely as marker where the lines should start and head them towards the vanishing point, then apply a transparency gradient for the whole image to make them "fade" in the distance. But I wonder, if there's an easier way to achieve this?
  23. Hi @Pixey, here is an example of a more complex task you can perform with the plugin. Hopefully it helps you to understand what the plugin does, how it works and how to use it. At first, let me start with a short elaboration on what a "channel" is, in case this is still unclear: you can imagine a channel as a large value table. For each pixel in height, there is a table row, for each pixel in width, there is a column. Each table cell stores one value from 0 to 255 for the corresponding pixel. There are 4 actual and 3 calculated channels for an image (or to be more PDN specific, 7 channels per layer): Red, Green, Blue and Alpha are the actual channels (shortened RGBA). Hue, saturation and luminosity (HSL) are calculated from the RGB values. (As a side note, the transformation from RGB to HSL and vice versa is not completely bijective, as different HSL values can lead to the same RGB color.) My plugin is designed to tinker with the values of the RGBA channels. Maybe it'll learn about the HSL channels later on, too, but right now it's limited to the RGBA channels. Now for the tutorial part. In this tutorial, we are going to perform a "downward compression" for one color channel of an image, namely red. This can be done by choosing two values: first, a certain threshold value, second a compression ratio. Below our threshold, channel values will not be changed. Values above the threshold however will have their exceedance reduced by our compression ratio. This means for an increasing source value, above the threshold the result value growth will be slower and the overall maximum value will be lower. Usually this is a technique to compress audio signals to dampen peaks (see "dynamic range compression"), but we can do that for images' color channels, too. The following image illustrates the compression we are going to perform on the red channel, choosing a threshold value of 100 and a compression ratio of 3:1: For the above image, I created a 256 pixels wide gradient from blue (RGB = 0, 0, 255) to magenta (255, 0, 255), so that at the "0" mark, the pixel values are (0, 0, 255), at the "100" mark they are (100, 0, 255), and so on. What we expect to happen when we apply the compression is that the blue value stays 255 for the whole gradient like it is. The red value does not change up to the "100" mark, then the value change "slows down" to +1 red per 3 pixels, resulting in (152, 0, 255) for the pixel at the "255" mark. The "152" is the result of the maximum red value "255" processed with our compression formula: 100+(255-100)/3 = 100+155/3 = 100+51,666... = 152 after rounding. Now let's actually do this with my plugin. We are going to do it in three logical steps: Split the original Red value into the unmodified amount (left, 0-100) and the to-be-compressed amount (right, 0-155), in two separate channels Perform the actual compression on the channel with the to-be-compressed values Add up both values again and assign the result as new Red value Step 1 - Split the amounts into two channels Given that my plugin has no single operation to perform the split operation, this step is probably the trickiest to figure out if you're not used to "chaining multiple simple operations to perform a complex operation". For me, being a programmer, seeing the tiny steps in complex tasks is what I do for a living, so it's obvious for me how to do it. Of course one does not have to be a programmer to see it, but I guess it helps. Anyway, this is how we can do it in three smaller steps using operations my plugin actually offers: Step 1.1 At first, we are going to subtract our constant threshold value "100" from the Red channel values. This means, for values less than or equal to the threshold, the result will be less than or equal to 0. For values above the threshold, the result is going to be greater than 0. We can store the result in one of the two temporary channels. Step 1.2 Next up, we apply an L-Threshold operation to that temporary channel and configure it to set all values less than 0 (first parameter, top row) to 0 (second parameter, second row). After this step, our temporary channel contains the "to-be-compressed" value per pixel. Note that L-Threshold allows us to define the replacement value independently from the threshold value. Since the threshold and the replacement value are identical, we could also use the Clamp operation with "0" and "any number greater than or equal to 155" as arguments, so that the second argument does not apply to any value in the temp channel. In our scenario, it does not make a difference. Step 1.3 Eventually, we apply the U-Threshold operation to the Red channel, with a threshold and replacement value of 100. This limits all values to a maximum of 100, but keeps lower values unmodified. Now, the Red channel contains the unmodified value amount for every pixel. Step 2 - Compress Applying the compression ratio is actually pretty straightforward. You Divide the value in the temporary channel by our constant compression ratio "3" and write the result back to the temporary channel as target channel. Note that both temporary channels actually store floating point values, so for a pixel that originally had "105" as red value, the temporary channel now holds 5 / 3 = "1.666..." as value, not "2" yet. In our example, we are going to add the value to an integer number and then immediately round the result, so we're not going to profit from keeping the precision here. But sometimes you want to multiply or clamp the result later on and it's good to know that for those two channels the values are kept with double precision, which should be "good enough" in all normal cases. Step 3 - Add up Adding both values is also simple. As the previous sentence suggests, you chose the Add operation, select the red and the temporary channel as arguments, and apply the result as the new Red value. Again, there is something to "note". As with the temporary channel, the value of the Red channel was changed in step 1.3, and using it as source again get the modified value. This is why you can order the modification steps - because the order actually makes a difference. This is how the plugin configuration should look like now: Tip: In case you don't see a difference yet, make sure you enabled the modifications. Newly added modifications are disabled by default, as they are likely not configured correctly yet and IMO it makes no sense to render the whole image with a presumably wrong configuration over and over again. Also, changes to disabled modifications do not trigger a render update, keeping Paint.NET responsive while configuring the values. And this is how the result looks when the modifications are applied with a selection of the gradient area. You can see how the color on the right end is far from magenta. With the color picker tool I have tested and can assure you, the Red values from 0 to 100 are 0, 1, 2, ..., 98, 99, 100, and the values from 101 to 255 are 100, 101, 101, 101, 102, ..., 150, 151, 151, 151, 152, which are the correct rounded values for 100.3, 100.6, 100.9, 101.3, 101.6, ... etc. I hope this extensive tutorial/example helps you to warm up to the plugin. Let me know if it helped you, I have an idea for another one, but I'd rather know if I need to change the way I write these tutorials first before I post another one in a second post taking me hours to write. Thank you for using my plugin, I hope it'll bring great joy and new possibilities to your art. Chris
  24. Hi Anthony, I actually saw your plugin, but it did not appear to fit my needs. If it had, I hadn't written the plugin. The main reason I made the plugin is because I work with OpenCV in Visual Studio from time to time. There is a plugin to display an image matrix as actual image again. OpenCV does not use RGB though, but BGR; yet the plugin interprets the channels as RGB, causing the Red and Blue channels to appear swapped. I could make a screenshot of that image and paste it to Paint.NET, but from what I can tell there is no possible operation chain to swap the channels back. Thus I decided to make a plugin for that (originally written in CodeLab and called "Swap Channels"). But then I thought "why not offer more operations", then noticed the CodeLab UI is too limited for this, and things got rolling. In the end, I ended up with a huuuge Visual Studio project and found the plugin to have been too much work to keep it for occasional personal use and not publish it. If I have understood your plugin correctly, it manipulates one channel, then the user clicks "OK", maybe opens the plugin again, manipulates the next channel, etc. In that case, an "Absolute" operation makes no sense since there are no negative input values in your use case. My plugin however allows you to chain multiple modifications (a necessity to perform a channel swap unless you have a dedicated "Swap" operation). Because of that, my plugin deliberately allows negative intermediate values in any channel. For example, you may assign "Red - 200" to the "Red" channel, and then continue to add values to that channel etc. In this case, "Absolute" can make sense, and since it's very cumbersome to simulate that operation with other operations but easy to implement it, I included it. I consider adding more features soon, but at that point, the functionality was rich enough to have it released. I'm not exactly sure what "Sharpen" is (haven't looked into your source code), but since it is not a specific channel operation, I will most likely not include some "overall visual effects" like sharpen, flatten, increase contrast etc. I spent five evenings on the plugin. One and a half on the calculation logic, three and a half on the layout planning and UI logic.
  25. I am not completely sure, but I think I just ran into the same bug and already found the cause. In the method populating the dropdowns, my maximum index was off by 1, making "Minimum" available as source operation for binary operations such as "Minimum", "Maximum", "Add", "Subtract" etc. Actually only Constant, Identity, Invert or Absolute should be allowed. Fixed in version 1.0.1, available as of now.
  • Create New...