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 <capellan2...@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 > > > _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode