Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to draw a border around a pixmap derived from png
Forum Updated to NodeBB v4.3 + New Features

How to draw a border around a pixmap derived from png

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 5 Posters 4.1k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    Hristo Konstantinov
    wrote on last edited by Hristo Konstantinov
    #6

    Unfortunately It's a little more complicated than that :/ I have a custom qgraphicsitem, which recieves an already processed pixmap which is made of a png spritesheet. Depending on the user actions, the different textures are cut, formatted with certain color and outline and then positioned in certain places of the pixmap. Since it's a very complicated process, it is done outside of the scene, and when assembled the pixmap is sent to the QGraphicsItem in the scene and displayed by it in its paint function. Here are some screenshots to get what I mean:

    the sprite sheet of the current tooth:
    18.png

    how does it look painted with the current tooth status:
    tq.png

    kshegunovK 1 Reply Last reply
    0
    • H Hristo Konstantinov

      Unfortunately It's a little more complicated than that :/ I have a custom qgraphicsitem, which recieves an already processed pixmap which is made of a png spritesheet. Depending on the user actions, the different textures are cut, formatted with certain color and outline and then positioned in certain places of the pixmap. Since it's a very complicated process, it is done outside of the scene, and when assembled the pixmap is sent to the QGraphicsItem in the scene and displayed by it in its paint function. Here are some screenshots to get what I mean:

      the sprite sheet of the current tooth:
      18.png

      how does it look painted with the current tooth status:
      tq.png

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #7

      Is there alpha in that pixmap? What I'd do is to underpaint a dilated version of the image, basically I'd run a filter on it once and save the result. Then underpaint the "shadow"/"outline" in the graphics item. Ideally this could be put in the actual sprite, though, couldn't it?

      Read and abide by the Qt Code of Conduct

      H 1 Reply Last reply
      0
      • kshegunovK kshegunov

        Is there alpha in that pixmap? What I'd do is to underpaint a dilated version of the image, basically I'd run a filter on it once and save the result. Then underpaint the "shadow"/"outline" in the graphics item. Ideally this could be put in the actual sprite, though, couldn't it?

        H Offline
        H Offline
        Hristo Konstantinov
        wrote on last edited by
        #8

        Yes, at the beginning the border was hardpainted in the sprite. But then a problem arised - in some cases the outline should be red, but the inside color should be changed from blue to green so I scrapped that idea. The pixmap has a transparent fill, so probably it has alpha. Can you give me some simple code example of what filter are you talking about?

        kshegunovK 1 Reply Last reply
        0
        • H Hristo Konstantinov

          Yes, at the beginning the border was hardpainted in the sprite. But then a problem arised - in some cases the outline should be red, but the inside color should be changed from blue to green so I scrapped that idea. The pixmap has a transparent fill, so probably it has alpha. Can you give me some simple code example of what filter are you talking about?

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by kshegunov
          #9

          @Hristo-Konstantinov said in How to draw a border around a pixmap derived from png:

          Yes, at the beginning the border was hardpainted in the sprite. But then a problem arised - in some cases the outline should be red, but the inside color should be changed from blue to green so I scrapped that idea.

          What inside color? I think I'm missing something.

          The pixmap has a transparent fill, so probably it has alpha.

          Yes, the transparency is "alpha" (i.e. the alpha channel).

          Can you give me some simple code example of what filter are you talking about?

          Not off hand, but I can point you to some resources I think.

          This is "dilate": https://en.wikipedia.org/wiki/Dilation_(morphology)
          and "erode": https://en.wikipedia.org/wiki/Erosion_(morphology)

          Ignore the math, the basic idea is similar to the median filter (the three are the same class of non-linear filters). Basically it goes like this:

          • Take a window of say 3 by 3 pixels that you move over the image, the center pixel of the window is the pixel position in which you're going to write the filtered value in the resulting image.
          • So the 9 pixels you have in the window you process in some fashion, for the median filter - take the median, for the dilate filter take the supremum (i.e. the maximum), for the erode - the infimum (i.e. the minimum). Now by value here I mean the alpha channel specifically. While you go you set the RGB to black/red/green w/e and you process the transparency - basically making the (visible) figure larger.
          • Write the RGBA to the corresponding pixel in the resulting image.

          Here's a toy project I'd made to illustrate color reduction in images. It's not what you want directly, but you can source some ideas on how to process images in Qt.

          (And by images I mean QImage, because QPixmap is truly abysmal for pixel-by-pixel operations).

          Read and abide by the Qt Code of Conduct

          1 Reply Last reply
          3
          • H Offline
            H Offline
            Hristo Konstantinov
            wrote on last edited by Hristo Konstantinov
            #10

            Thanks for the detailed answer! Definitely will check those out tomorrow.
            I meant outline, not border. At first I drew the teeth surfaces in photoshop with red outline and blue inner part, and if I needed an outline, I just painted the sprite untouched. But then it became necessary in some cases for the inner part to be green (blue is filling, green is filling made by the user, red outline means filling with caries underneath), so I had to find a way to do all the painting runtime, while using only the alpha of the png. Anyway, the code I pasted above works for now. Again - many thanks for the guidance!

            kshegunovK 1 Reply Last reply
            0
            • H Hristo Konstantinov

              Thanks for the detailed answer! Definitely will check those out tomorrow.
              I meant outline, not border. At first I drew the teeth surfaces in photoshop with red outline and blue inner part, and if I needed an outline, I just painted the sprite untouched. But then it became necessary in some cases for the inner part to be green (blue is filling, green is filling made by the user, red outline means filling with caries underneath), so I had to find a way to do all the painting runtime, while using only the alpha of the png. Anyway, the code I pasted above works for now. Again - many thanks for the guidance!

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by kshegunov
              #11

              I was bored while I was chugging my coffee, so I made this micro-demonstration:

              https://bitbucket.org/kshegunov/dilate/src/master/

              I think this is what you wanted to achieve. Enjoy!

              Read and abide by the Qt Code of Conduct

              mrjjM A 2 Replies Last reply
              3
              • kshegunovK kshegunov

                I was bored while I was chugging my coffee, so I made this micro-demonstration:

                https://bitbucket.org/kshegunov/dilate/src/master/

                I think this is what you wanted to achieve. Enjoy!

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #12

                @kshegunov

                alt text

                That's a pretty outline ! Good coffee :)

                kshegunovK 1 Reply Last reply
                0
                • mrjjM mrjj

                  @kshegunov

                  alt text

                  That's a pretty outline ! Good coffee :)

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by
                  #13

                  @mrjj said in How to draw a border around a pixmap derived from png:

                  Good coffee :)

                  You know the meme ;)

                  Read and abide by the Qt Code of Conduct

                  1 Reply Last reply
                  1
                  • kshegunovK kshegunov

                    I was bored while I was chugging my coffee, so I made this micro-demonstration:

                    https://bitbucket.org/kshegunov/dilate/src/master/

                    I think this is what you wanted to achieve. Enjoy!

                    A Offline
                    A Offline
                    Albertino
                    wrote on last edited by
                    #14

                    @kshegunov great work!

                    Only a small change needed in maxAlpha function:

                    maxI = std::min(x + window + 1, image.width())
                    maxJ = std::min(y + window + 1, image.height())
                    

                    Otherwise (without the +1) there is a missing left pixel

                    kshegunovK 1 Reply Last reply
                    2
                    • A Albertino

                      @kshegunov great work!

                      Only a small change needed in maxAlpha function:

                      maxI = std::min(x + window + 1, image.width())
                      maxJ = std::min(y + window + 1, image.height())
                      

                      Otherwise (without the +1) there is a missing left pixel

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by
                      #15

                      Yes indeed. I completely missed that rightmost image pixel.
                      Do you mind opening a pull request so I can merge this in the repo?

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved