Code archives/Graphics/OIL painting

This code has been declared by its author to be Public Domain code.

Download source code

OIL painting by PantsOn
(Posted 22 years ago)
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