Code archives/Graphics/OIL painting
This code has been declared by its author to be Public Domain code.
Download source code
| v3. used banks instead of image. less error checking 3x quicker than v2 ![]() usage new_img = OILimage(orig_img) new_img = OILimage(orig_img,11) the higher the brush_detail the larger the brush and more time it takes. defaults to 5 |
Dim OILcol(1,0) ; OILimage - Rich Hanson (PantsOn Software) ; v3 Function OILimage(image_img,brush_detail=5) ; set variables iw = ImageWidth(image_img) ih = ImageHeight(image_img) output_img = CreateImage(iw,ih) ib = ImageBuffer(image_img) ob = ImageBuffer(output_img) scan = brush_detail / 2 brush_detail2 = brush_detail*brush_detail ; create temp bank for pic data ; bank is larger than needed so no need to error check later LockBuffer ib tmp_bnk = CreateBank(4*(iw+brush_detail)*(ih+brush_detail)) For x = 0 To iw - 1 For y = 0 To ih - 1 PokeInt tmp_bnk,(x+scan)*4 + (y+scan)*(iw+brush_detail)*4, ReadPixelFast(x,y,ib) And %00000000111111001111110011111100 Next Next UnlockBuffer ib ; convert pic data LockBuffer ob For x = 0 To iw - 1 For y = 0 To ih - 1 Dim OILcol(1,brush_detail2) count = 0 ; scan around pixel. No more error checking For x1 = -scan To scan For y1 = -scan To scan ; read values from bank rather than screen c = PeekInt(tmp_bnk,(x+x1+scan)*4 + (y+y1+scan)*(iw+brush_detail)*4) ; stpre populatiry of colour (needs opt) For i = 0 To count If OILcol(0,i) = c OILcol(1,i) = OILcol(1,i) + 1 i = brush_detail2 + 2 EndIf Next If i = count + 1 OILcol(0,count) = c OILcol(1,count) = 1 count = count + 1 EndIf Next Next ; find highest most common colour (needs opt) high = 0 For a = 0 To brush_detail2 If OILcol(1,a) > high OILcolour = OILcol(0,a) high = OILcol(1,a) EndIf Next WritePixelFast x,y,OILcolour,ob Dim OILcol(0,0) Next Next UnlockBuffer ob ; free temp stuff FreeBank tmp_bnk Dim OILcol(0,0) ; return new piccy Return output_img End Function |
