How to protect your web site pictures from being saved

A customer emailed me:

As you are an expert I have the following question that maybe you know to answer.

 

My wife is an artist making cards for every occasion.

We have now the idea of selling these cards through internet.

Showing these cards on a gallery page is one thing.

This brings the risk that people will save the page and use the images while not paying for them.

Do you know of any way how to prevent this saving with all the images?

 

I’m no expert on digital rights management, but one way to make it more difficult for images to be saved is to make them into multiple fragments. Users will have a harder time saving the image locally, although they can just piece together the image using the inverse of the sample code below or just hit alt-prtscrn to capture the screen contents to the clipboard.

Another solution is to show a low resolution sample of the original (the source code allows you to save as JPG, specifying the quality of the sampling).

(The Internet Explorer Image Toolbar appears when the user hovers the mouse over a picture. This can be disabled by the content author using an HTML tag. Images of less than 200 x 200 pixels will not show the IE toolbar. However, in both cases, the user can still right-click on the picture and choose “Save Picture As”.)

This is a sample generated HTML from the code below.

<head>

    <title>Show fragmented picture</title>

</head>

<body>

<table id="Pic" cellspacing="0" cellpadding="0" border=0 >

<tr>

<td><img src=Pic0000.jpg border=0 /></td>

<td><img src=Pic0100.jpg border=0 /></td>

<td><img src=Pic0200.jpg border=0 /></td>

<td><img src=Pic0300.jpg border=0 /></td>

</tr>

<tr>

<td><img src=Pic0001.jpg border=0 /></td>

<td><img src=Pic0101.jpg border=0 /></td>

<td><img src=Pic0201.jpg border=0 /></td>

<td><img src=Pic0301.jpg border=0 /></td>

</tr>

<tr>

<td><img src=Pic0002.jpg border=0 /></td>

<td><img src=Pic0102.jpg border=0 /></td>

<td><img src=Pic0202.jpg border=0 /></td>

<td><img src=Pic0302.jpg border=0 /></td>

</tr>

<tr>

<td><img src=Pic0003.jpg border=0 /></td>

<td><img src=Pic0103.jpg border=0 /></td>

<td><img src=Pic0203.jpg border=0 /></td>

<td><img src=Pic0303.jpg border=0 /></td>

</tr>

</body>

Full source code (about 200 lines) available here

This is the FragmentPic method of the class that takes the loaded image and fragments it into a grid of x, y segments, generating small JPGs and the HTML to display them. The code uses the GDI+ Flat API to draw the image, then screen scrape the image in grid cell fragments and saves them to JPGs.

      PROCEDURE PicFragment(nXSegs as Integer, nYSegs as Integer, cPicFragName as String, cOutputHTM as String)

            LOCAL nHeightOrig, nWidthOrig, nHeight, nWidth,oy,iy,ix,nRatio,nSize

            nHeightOrig=0

            nWidthOrig=0

            GdipGetImageWidth(ox.nImage,@nWidthOrig)

            GdipGetImageHeight(ox.nImage,@nHeightOrig)

            nRatio=nWidthOrig/nHeightOrig

            nSize=400 && change this to vary resolution

            nWidth=nSize *nRatio

            nHeight=nSize

            ox.DrawScale(_screen.HWnd,0,0,nWidth,nHeight,0,0,nWidthOrig, nHeightOrig)

            FOR iy = 0 TO nYSegs-1

                  FOR ix = 0 TO nXSegs-1

                        oy=NEWOBJECT("gdplusEx")

                        oy.GetRegion(_screen.HWnd,ix*nWidth/nXSegs, iy*nHeight/nYSegs, nWidth/nXSegs, nHeight /nYSegs)

                        oy.save(cPicFragName+PADL(ix,2,"0")+PADL(iy,2,"0")+".jpg",95) && change last parm for jpg quality

                  ENDFOR

            ENDFOR

            * Now generate the HTML to show the multiple JPG fragments

            SET TEXTMERGE ON TO (cOutputHTM) noshow

            \<head>

            \ <title>Show fragmented picture</title>

            \</head>

            \<body>

            \<table id="Pic" cellspacing="0" cellpadding="0" border=0 >

            FOR iy = 0 TO nYSegs-1

                  \<tr>

                  FOR ix = 0 TO nXSegs-1

                        * optionally add galleryimg="no" to the img tag

                        \<td><img src=<<cPicFragName+PADL(ix,2,"0")+PADL(iy,2,"0")>>.jpg border=0 /></td>

                  ENDFOR

                  \</tr>

            ENDFOR

            \</body>

            SET TEXTMERGE to

32438