7

There’s a tool that I’d really like to have, and AFAIK it does not exist at all. When drawing textures freehand one typically wants them to be seamless. How I’d go about that is having larger image than the texture being drawn. Let the texture be a square in the middle of it. If any pixels change before the left edge of the texture, mirror that change to the before the right side inside the texture. Same from the other overlaps. That way, you can draw something at the edge and the opposing edge will be affected.

I was thinking of writing python code to do that, but I am not sure how. I wanted this to be as automatic as possible. How can I draw like this?

0

3 Answers 3

10

In Gimp 2.10, you don't need to do this, you just use the Symmetry painting feature.

  • Create an image which is 3x3 the size of your intended tile (in theory, 2x2 is enough but the effect is easier to check with 3x3).
  • Set the symmetry to "Tiling" and give the size of intended tile
  • Paint away
  • When done, crop your image to the intended tile size.

In this image:

enter image description here

  • I just made two short brush strokes
  • You can cut a 100x100 square anywhere and it will be a seamless tiling pattern (all cuts will give the same result, only the offset will change)

If you insist in doing it the old way with Python, you can use the old seamless-helper script that does the "offset-by-half" thing on layers to swap center and corners (and sort of remembers where you are to avoid a Rubik's cube syndrome).

5
  • 1
    Can you elaborate on "Rubik's cube syndrome"? My googling only resulted on articles about issues caused by excessive usage of the toy, even with other keywords like tiling and graphics added in. Oct 17, 2022 at 8:53
  • The script will swap center/corners but also top/bottom and left/right halves. if you don't track in which order you do this, you end up with a jumble and coming back to the original is akin to figuring out the moves of a Rubik's cube.
    – xenoid
    Oct 17, 2022 at 9:49
  • Just a note here, you don't even have to have an image x times bigger than the tile you are making. It's quite possible to do this on just one tile. There's a wrap around function which means if you paint over one edge it automatically paints at the opposite side. +1 nice answer, didn't even know this existed!
    – Billy Kerr
    Oct 17, 2022 at 16:47
  • @BillyKerr Yes, but it's hard to check the global effect on a single tile.
    – xenoid
    Oct 17, 2022 at 17:02
  • huh. I am kinda used to just offsetting 50% both ways and using that, no reassembly needed... Oct 18, 2022 at 10:29
4

I have discovered a way to do this exactly as I wanted. Steps:

  1. Decide the size of your final texture, for example 1024x1024
  2. Decide on a margin you want to have around it to be able to see the mirroring and add that - let's say 250 px
  3. Your final image that you create is going to be textureSize + 2* margin, so in our case 1524x1524. Create an image with that size and transparent background
  4. Now create following layers
    1. Drawing layer, same size as the image
    2. Background layer, filled with the background color
    3. Texture layer, with the size of the expected result, so 1024x1024
  5. Have the layers in this order
    enter image description here
  6. Now align the texture layer in the middle:
    1. Select the enter image description here Alignment tool
    2. Click on the texture layer in the drawing area
    3. In the tool options, select Relative to: Image
    4. Align to center both vertically and horizontally
  7. It should look like this:
    enter image description here
  8. Now go to Windows->Dockable Dialogs-> enter image description here Symetry painting. Click it
  9. Then set it up like this, using the size of your texture as the tiling interval: enter image description here
  10. Start painting and observe the edges are replicated. I added a yellow frame to highlight where the actual texture starts:
    enter image description here
  11. To export, you'll need to select the inside of the texture, that's why I asked you to create the layer for it, even though you don't draw on it. Select the texture layer in the Layers dialog and then use the enter image description here Fuzzy select tool to select the contents of this empty layer.
  12. Press CTRL+SHIFT+C to copy both the drawing layer and the background layer
  13. Press CTRL+SHIFT+V to paste it to a new image. This is your result, you can export it.
1
  • +1 from me. Cool!
    – Billy Kerr
    Oct 16, 2022 at 12:36
3

There are a couple of ways you could make seamless patterns/tiles in GIMP.

The first is using Filters > Map > Tile Seamless. This may work better for some textures than others. Probably better with random textures rather than more distinct patterns.

An example. I've used a plasma render here for a basic texture, and applied the Tile Seamless filter

enter image description here

Or

If you want to create a seamless tile manually, you could use this method.

  1. Create your painted texture/pattern, avoiding the edges, keep everything to the centre, with nothing going off the edges.

enter image description here

  1. Do Layer > Transform > Offset, and enter X and Y values such that they are half of the width or height of your image. In this example, my image is 200 x 200px, so I entered 100 for the X and Y

enter image description here

  1. Paint more details filling up the middle, being careful not to go over any edges.

That's it really, the pattern/tile will be seamless. You can repeat this several times and add more and more detail, perhaps even vary the offset. Always make sure that you never paint over an edge.

enter image description here

Edit: something else I have just discovered. It is possible to drag around the image in the Offset filter, in a kind of wrap around mode. You could drag it, hit enter, paint some more. The shortcut for the Offset filter is Ctrl+Shift+o. It's entirely possible to build up a very complex seamless tile using this method - always making sure of course that you never paint over an edge.

enter image description here

5
  • Thanks for the tip. I'll move the question to SO. I have found that SO actually does have a tag for programming GIMP, I did not expect that. Regarding having the code to begin with - what code can I have when I don't know how to start. I know how to implement this in theory, but without documentation I don't know where to pud the inplementation so that gimp calls it. Oct 16, 2022 at 11:08
  • Sorry, I'm just a graphic designer. I can't even point you to any documentation on coding plugins/scripts for GIMP. Really sorry, just not my thing. Good luck anyway!
    – Billy Kerr
    Oct 16, 2022 at 11:19
  • Another possible solution for you might be to have a look at Krita - it actually has a seamless pattern/wrap around function already built in. A tutorial here
    – Billy Kerr
    Oct 16, 2022 at 11:40
  • I rephrased the question to fit this site. I really appreciate you trying to answer instead of just downvoting and moving on. I have also found my own method, which does exactly what I wanted without any coding. It just took a lot of searching to find that. Oct 16, 2022 at 12:12
  • @TomášZato - no worries. Glad you found it useful. You might want to add your own method as an answer if it's substantially different to what I suggested. It's always nice to see different approaches.
    – Billy Kerr
    Oct 16, 2022 at 12:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.