Atkinson dither algorithm

Alejandro Tejada capellan2000 at gmail.com
Sat Oct 7 02:22:49 EDT 2017


I have posted a demo stack in the forums:
https://forums.livecode.com/viewtopic.php?f=10&t=29935

Have a nice weekend!
Al

On Sat, Oct 7, 2017 at 1:52 AM, Alejandro Tejada <capellan2000 at gmail.com>
wrote:

> Hi All,
>
> I am stuck trying to make this code for Bill Atkinson
> dithering algorithm much more faster.
> Any ways to speed this code?
> Follow the recipe and watch out for lines broken
> by mail character length limit.
>
> Recipe:
>
> 1) Import an small image (200x200 pixels) and
> name it as "Image" (you could import a small
> transparent png or a small jpg image)
>
> 2) Optionally, create a scrollbar type slider
> with a range between 0 and 255.
> Set the name of this scrollbar as "ThresholdDither"
> and move the slider to 127 or 0 or 255.
>
> 3) Paste the following script in a button and
> click on it to run this code:
>
> on mouseUp
>
>    put the millisecs into startTime
>    set the cursor to busy
>
>    put the alphadata of img "Image" into tAlphaData
>    put the imagedata of img "Image" into tVar
>    -- img "Image" could be a grayscale image
>    -- where all 3 channels: Red, Green, Blue
>    -- are identical or a color image where only
>    -- the red channel is used
>
>    delete char 1 of tVar
>    -- the first char of the imagedata is part
>    -- of the alphadata or maskdata
>    repeat with i = 1 to length(tVar) step 4
>       put chartonum(char i of tVar) & space after fldhex
>    end repeat
>    delete last char of fldhex -- a space
>    -- fldhex now contains a single channel of the RGB image
>    -- converted to numbers between 0 and 255
>
>    put the number of words of fldhex into lenghtofldhex
>    put the width of img "Image" into tImageWidth
>    put the height of img "Image" into tImageHeight
>
>    repeat with i = 1 to lenghtofldhex step tImageWidth
>    -- We need as many words per line, as pixels contains
>    -- the image width (because each pixel is represented
>    -- by a word and this word is number between 0 and 255)
>
>    put word i to ( i + ((tImageWidth) - 1)) of fldhex & cr after fldhexa2
>    end repeat
>
>    put empty into fldhex
>    delete last char of fldhexa2
>    -- deleting the last cr character
>
>    put the number of lines of fldhexa2 into sYsize
>    put the number of words of line 1 of fldhexa2 into sXsize
>
>    // get the scrollbar value
>    -- tThreshold is a value between 0 and 255
>    if existence(sb the "ThresholdDither") then
>    put thumbPos of sb the "ThresholdDither" into tThreshold
>    else
>    put 127 into tThreshold
>    end if
>
>    repeat with tY = 1 to sYsize
>       repeat with tX = 1 to sXsize
>
>          put tX into tPixelPosition
>
>          put word (tPixelPosition) of line tY of fldhexa2 into
> tOldPixelValue
>
>          if round(tOldPixelValue) <= tThreshold then
>             put 0 into tNewPixelValue
>          else
>             put 255 into tNewPixelValue
>          end if
>
>          put (tOldPixelValue - tNewPixelValue)/8 into tDifusionError
>
>          -- Atkinson dither add the diffusion error
>          -- to 6 adjacent pixels
>          --         x o o
>          --      o o o
>          --         o
>
>          put tNewPixelValue & space after fldhexa3
>
>
>             if tPixelPosition < sXsize then
>                put tDifusionError + word (tPixelPosition + 1) of line tY
> of fldhexa2 into word (tPixelPosition + 1) of line tY of fldhexa2
>
>
>               if tPixelPosition < (sXsize-1) then
>                   put tDifusionError + word (tPixelPosition + 2) of line
> tY of fldhexa2 into word (tPixelPosition + 2) of line tY of fldhexa2
>                end if
>
>
>             end if
>
>
>             if tY < sYsize then
>
>
>                if tPixelPosition > 1 then
>                   put tDifusionError + word (tPixelPosition - 1) of line
> tY + 1 of fldhexa2 into word (tPixelPosition - 1) of line tY + 1 of fldhexa2
>                end if
>
>
>                put tDifusionError + word (tPixelPosition) of line tY + 1
> of fldhexa2 into word (tPixelPosition) of line tY + 1 of fldhexa2
>
>
>                if tPixelPosition < sXsize then
>                   put tDifusionError + word (tPixelPosition + 1)  of line
> tY + 1 of fldhexa2 into word (tPixelPosition + 1) of line tY + 1 of fldhexa2
>                end if
>
>
>                if tY < (sYsize - 1) then
>                   put tDifusionError + word (tPixelPosition) of line tY +
> 2 of fldhexa2 into word (tPixelPosition) of line tY + 2 of fldhexa2
>                end if
>
>
>             end if
>
>       end repeat
>    end repeat
>
>    replace "0" with "00" in fldhexa3
>    replace "255" with "FF" in fldhexa3
>
>    repeat with i = 1 to the number of words of fldhexa3
>       put 00 & word i of fldhexa3 & word i of fldhexa3 & word i of
> fldhexa3 after tVar2
>    end repeat
>    put binaryEncode("H*",tVar2) into tVar3
>
>    create img
>    set the height of it to the height of img "Image"
>    set the width of it to the width of img "Image"
>    set the imagedata of it to tVar3
>    set the alphaData of it to tAlphaData
>
>    put the millisecs - startTime && "milliseconds to create Atkinson
> Dither"
>
> end mouseUp
>
> Thanks in advance!
> Al
>
>
>



More information about the use-livecode mailing list