About Monkey 2 › Forums › Monkey 2 Development › A better way to set image pixels (With Example)
Tagged: Pixel drawing speed optimise
This topic contains 4 replies, has 3 voices, and was last updated by 
 cocon 1 year, 3 months ago.
- 
		AuthorPosts
 - 
		
			
				
January 5, 2018 at 6:59 pm #12678
I have a case where I want to modify the pixels of an image. So based on trying a few stuff I result to this example.
Monkey1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#Import "<std>"#Import "<mojo>"Using std..Using mojo..Class MyWindow Extends WindowField canvasDraw:CanvasField canvasImage:ImageField imageWidth:Int, imageHeight:IntMethod New()Super.New("", 800, 600)Local loadedImage := Image.Load("C:/___.jpg")imageWidth= loadedImage.WidthimageHeight= loadedImage.HeightcanvasImage = New Image(imageHeight, imageHeight, PixelFormat.RGBA8, TextureFlags.Dynamic)canvasDraw = New Canvas(canvasImage)canvasDraw.DrawImage(loadedImage, 0, 0)canvasDraw.Flush()EndMethod OnRender(canvas:Canvas) OverrideApp.RequestRender()If (Mouse.ButtonDown(MouseButton.Left))For Local i := 0 To 100Local pix := canvasDraw.CopyPixmap(canvasDraw.Viewport)Local color := pix.GetPixel(imgRndX, imgRndY)pix.SetPixel(imgRndX, imgRndY, color)canvasImage.Texture.PastePixmap(pix, 0, 0)canvasDraw.Flush()NextEndcanvas.DrawImage(canvasImage, 0, 0)EndProperty imgRndX:Int()Return Rnd(0, imageWidth)EndProperty imgRndY:Int()Return Rnd(0, imageHeight)EndEndFunction Main()New AppInstanceNew MyWindowApp.Run()EndThis example works fine, but if in the future are better ways that allow moving pixels directly (without allocating new Pixmaps) it wll be much preferred.
Monkey1canvasImage.Texture.SetPixel(p, imgRndX, imgRndY)January 5, 2018 at 8:17 pm #12679That is a slow way to access pixel, what stops you from just using texture via canvas and draw it permanently onto that like this?
Monkey1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#Import "<std>"#Import "<mojo>"#Import "assets/"Using std..Using mojo..Class MyWindow Extends WindowField canvasDraw:CanvasField canvasImage:ImageField x:IntField xd:Int = 10Method New()Super.New("", 800, 600)canvasImage = New Image(512, 512, PixelFormat.RGBA8, TextureFlags.Dynamic)canvasDraw = New Canvas(canvasImage)Local loadedImage := Image.Load("asset::picture.jpg")canvasDraw.DrawImage(loadedImage, 0, 0)canvasDraw.Flush()EndMethod OnRender(canvas:Canvas) OverrideApp.RequestRender()If (Mouse.ButtonDown(MouseButton.Left))For Local i := 0 To 10000canvasDraw.DrawRect(Int(Rnd(0,511)),Int(Rnd(0,511)),1,1) ' Plot a single pixel' pix := canvasDraw.CopyPixmap(canvasDraw.Viewport)' pix.GetPixel(imgRndX, imgRndY)' pix.SetPixel(imgRndX, imgRndY, color)' canvasImage.Texture.SetPixel(p, imgRndX, imgRndY)' canvasImage.Texture.PastePixmap(pix, 0, 0)NextcanvasDraw.Flush()Endcanvas.DrawImage(canvasImage, x, 0)x=x+xdIf xd > 0 And x >= (800-512) Then xd = -xdIf xd < 0 And x <= (0) Then xd = -xdEndEndFunction Main()New AppInstanceNew MyWindowApp.Run()EndJanuary 7, 2018 at 9:20 pm #12743So using the canvas is faster right? OK I will result to it then. But still I would try a few other things if I can get it done.
January 8, 2018 at 9:41 am #12751January 10, 2018 at 9:07 am #12795Good one!
 - 
		AuthorPosts
 
You must be logged in to reply to this topic.