Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Image with radius in QML

Image with radius in QML

Scheduled Pinned Locked Moved QML and Qt Quick
13 Posts 6 Posters 25.9k Views
  • 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.
  • J Offline
    J Offline
    javiyt
    wrote on 22 Jun 2011, 01:43 last edited by
    #1

    Hi, how could I set rounded corners in an Image in QML? I tried simulated it with a rectangle behind but it didn't work. Any suggests?

    1 Reply Last reply
    0
    • C Offline
      C Offline
      Chuck Gao
      wrote on 22 Jun 2011, 02:04 last edited by
      #2

      There is no direct way to set rounded corner for Image. But as you think, we need some tricks. Rectangle behide the Image is not work, but you can try in front of the Image, set the Rectangle's color to "transparent", and set it's border and radius.

      Chuck

      1 Reply Last reply
      0
      • B Offline
        B Offline
        baysmith
        wrote on 22 Jun 2011, 04:33 last edited by
        #3

        It is possible with the "QML Shaders":http://labs.qt.nokia.com/2011/05/03/qml-shadereffectitem-on-qgraphicsview/ plugin.

        @

        import QtQuick 1.0
        import Qt.labs.shaders 1.0

        Item {
        width: 600
        height: 300

        Rectangle {
            id: mask
            anchors.centerIn: parent
            width: 400
            height: 200
            radius: 20
        }
        
        Image {
            id: image
            anchors.fill: mask
            source: "test.jpg"
        }
        
        ShaderEffectSource {
            id: sourceMask
            smooth: true
            hideSource: true
            sourceItem: mask
        }
        ShaderEffectSource {
            id: sourceImage
            hideSource: true
            sourceItem: image
        }
        
        ShaderEffectItem {
            id: maskEffect
            anchors.fill: mask
        
            property variant sourceTexture: sourceImage
            property variant maskTexture: sourceMask
        
            vertexShader: "
                uniform highp mat4 qt_ModelViewProjectionMatrix;
                attribute highp vec4 qt_Vertex;
                attribute highp vec2 qt_MultiTexCoord0;
        
                varying highp vec2 qt_TexCoord;
        
                void main(void)
                {
                    qt_TexCoord = qt_MultiTexCoord0;
                    gl_Position =  qt_ModelViewProjectionMatrix * qt_Vertex;
                }
            "
        
            fragmentShader: "
                uniform lowp sampler2D sourceTexture;
                uniform lowp sampler2D maskTexture;
                varying highp vec2 qt_TexCoord;
        
                void main (void)
                {
                    vec4 c = texture2D(sourceTexture, qt_TexCoord);
                    vec4 m = texture2D(maskTexture, qt_TexCoord);
                    gl_FragColor = vec4(c.rgb, m.a);
                }
            "
        }
        

        }
        @

        Nokia Certified Qt Specialist.

        1 Reply Last reply
        0
        • C Offline
          C Offline
          Chuck Gao
          wrote on 22 Jun 2011, 04:43 last edited by
          #4

          Yes, fantastic :-)

          Chuck

          1 Reply Last reply
          0
          • J Offline
            J Offline
            javiyt
            wrote on 22 Jun 2011, 09:07 last edited by
            #5

            Thank you for your answers!

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andre
              wrote on 22 Jun 2011, 11:19 last edited by
              #6

              Interesting approach, but to be honest, I don't think this kind of code is really what we should strive for in QML. It is not really readable, and also not really declarative.

              I'm sure your code produces a faster UI, but for simplicity, I would go for something like this:

              @

              import QtQuick 1.0

              Item {
              width: 600
              height: 300

              Rectangle {
                  id: mask
                  anchors.centerIn: parent
                  width: 400
                  height: 200
                  radius: 20
              
                  Image {
                      id: image
                      anchors.fill: parent
                      source: "test.jpg"
                  }
              }
              

              }
              @

              That should work as well, and is, IMHO, clearer to read.

              1 Reply Last reply
              0
              • J Offline
                J Offline
                javiyt
                wrote on 22 Jun 2011, 12:53 last edited by
                #7

                At the beginning I tried with that code but it didn't work. The image is set over the rectangle hidding the round corners. I will try again but I think it doesn't work.

                If I nest, in the opposite way, the Rectangle inside the Image, it shows the border over the image but it doesn't hide the corners either.

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  andre
                  wrote on 22 Jun 2011, 13:40 last edited by
                  #8

                  Sorry, you probably need to enable clipping.

                  @

                  import QtQuick 1.0

                  Item {
                  width: 600
                  height: 300

                  Rectangle {
                      id: mask
                      anchors.centerIn: parent
                      width: 400
                      height: 200
                      radius: 20
                      clip: true
                  
                      Image {
                          id: image
                          anchors.fill: parent
                          source: "test.jpg"
                      }
                  }
                  

                  }
                  @

                  Edit:
                  On the other hand: the docs to state:
                  [quote]Non-rectangular clipping regions are not supported for performance reasons.[/quote]

                  So, perhaps a rounded rect will not clip properly after all.

                  1 Reply Last reply
                  0
                  • J Offline
                    J Offline
                    javiyt
                    wrote on 22 Jun 2011, 14:09 last edited by
                    #9

                    I tried the code but it doesn't work. I copied it directly to qt and tried it.

                    The same is happening, the image is over the rectangle. How to make it fit to the shape of the rectangle?

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      andre
                      wrote on 22 Jun 2011, 14:24 last edited by
                      #10

                      I am afraid, that the solution I proposed indeed does not work. Sorry for setting you on the wrong track.

                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        AlterX
                        wrote on 1 Dec 2013, 16:54 last edited by
                        #11

                        Hello,
                        I am trying the shader solution, but it gives me this error at runtime:
                        @
                        QGLShaderProgram::addShader: Program and shader are not associated with same context.
                        QGLShaderProgram::addShader: Program and shader are not associated with same context.
                        QGLShader::link: "Link Error: Vertex shader is missing.
                        Link Error: Fragment shader is missing.
                        "
                        ShaderEffectItem: Shader compilation failed:
                        "Link Error: Vertex shader is missing.
                        Link Error: Fragment shader is missing.
                        "
                        QGLShader::link: "Link Error: Vertex shader is missing.
                        Link Error: Fragment shader is missing.
                        "
                        QGLShaderProgram::uniformLocation( qt_ModelViewProjectionMatrix ): shader program is not linked
                        QGLShaderProgram::addShader: Program and shader are not associated with same context.
                        QGLShaderProgram::addShader: Program and shader are not associated with same context.
                        QGLShader::link: "Link Error: Vertex shader is missing.
                        @

                        And this is the code I have used:
                        @
                        Item {
                        width: 200
                        height: 200
                        //radius: 20
                        //border.width: 6
                        //border.color: "#ffea00"

                        signal tapOnProfilePicture
                        
                        property alias profileImageSource: image.source
                        
                        
                        Rectangle {
                            id: mask
                            anchors.centerIn: parent
                            width: 200
                            height: 200
                            radius: 20
                        }
                        
                        Image {
                            id: image
                            anchors.fill: mask
                            source: "qrc:/images/profile-mask.png"
                        }
                        
                        ShaderEffectSource {
                            id: sourceMask
                            smooth: true
                            hideSource: true
                            sourceItem: mask
                        }
                        ShaderEffectSource {
                            id: sourceImage
                            hideSource: true
                            sourceItem: image
                        }
                        
                        ShaderEffectItem {
                            id: maskEffect
                            anchors.fill: mask
                        
                            property variant sourceTexture: sourceImage
                            property variant maskTexture: sourceMask
                        
                            vertexShader: "
                               uniform highp mat4 qt_ModelViewProjectionMatrix;
                               attribute highp vec4 qt_Vertex;
                               attribute highp vec2 qt_MultiTexCoord0;
                        
                               varying highp vec2 qt_TexCoord;
                        
                               void main(void)
                               {
                                   qt_TexCoord = qt_MultiTexCoord0;
                                   gl_Position =  qt_ModelViewProjectionMatrix * qt_Vertex;
                               }
                           "
                        
                            fragmentShader: "
                               uniform lowp sampler2D sourceTexture;
                               uniform lowp sampler2D maskTexture;
                               varying highp vec2 qt_TexCoord;
                        
                               void main (void)
                               {
                                   highp vec4 c = texture2D(sourceTexture, qt_TexCoord);
                                   highp vec4 m = texture2D(maskTexture, qt_TexCoord);
                                   gl_FragColor = vec4(c.rgb, m.a);
                               }
                           "
                        }
                        
                        MouseArea {
                            z: 10
                            anchors.fill: parent
                            onClicked: {
                                tapOnProfilePicture()
                            }
                        }
                        

                        }
                        @

                        Notice I have added highp to vec4 declarations to avoid other errors.

                        Qt Ambassador
                        Real-time cooperative teams: http://www.softairrealfight.net
                        Free Real-time network platform sdk: https://github.com/AlterX76/Solomon

                        https://codereview.qt-project.org/...

                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          Brexis
                          wrote on 9 Apr 2014, 05:45 last edited by
                          #12

                          Hi you can use an "OpacityMask":http://qt-project.org/doc/qt-5/qml-qtgraphicaleffects-opacitymask.html. Use a rounded image and mask your image with it.

                          1 Reply Last reply
                          1
                          • A Offline
                            A Offline
                            AlterX
                            wrote on 9 Apr 2014, 08:09 last edited by
                            #13

                            [quote author="Brexis" date="1397022356"]Hi you can use an "OpacityMask":http://qt-project.org/doc/qt-5/qml-qtgraphicaleffects-opacitymask.html. Use a rounded image and mask your image with it.[/quote]

                            Yes, that is a good solution!

                            Qt Ambassador
                            Real-time cooperative teams: http://www.softairrealfight.net
                            Free Real-time network platform sdk: https://github.com/AlterX76/Solomon

                            https://codereview.qt-project.org/...

                            1 Reply Last reply
                            1

                            • Login

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