Notifications
Clear all

[Closed] Check for a red pixel in a bitmaptexture

Hi,
I need to check some generated wirecolor-elements for red pixels. If there are any, they need to be processed some more. I have made something which checks for red pixels, but it uses try/catch. I’m wondering if there is a more elegant solution out there.

	function fn_pasteCheckForRed colorRedWire p1 c2 p2 =
    	(
    		/*
    		<DOC> Checks an image for any red pixels. Returns an undefined value if this happens. This will create an error which can be caught.
    		Arguments:
    			<color> colorRedWire: the red wirecolor channel
    		Return:
    			<color> the resulting color.
    		*/
    		if (colorRedWire as point4).x > 0.0 do colorRedWire=undefined
    		colorRedWire
    	)
    --theBmp is the bitmaptexture I'm checking for red pixels
    redPresent = try(pastebitmap theBmp theBmp[0,0] [0,0] type:#function function:fn_pasteCheckForRed)catch(true)

If there’s any pixel with a hint of red, the pastebitmap function will create an error. This is caught by the try/catch.
Thanks,
Klaas Nienhuis

4 Replies
 JHN

What version of max, I think in 2010 pasteBitmap function is broken.

-Johan

i think that simple getpixels method will work faster:


 fn doesColorExist bmp color:red = 
(
	found = off
	for y=0 to bmp.height-1 while not found do
	(
		for c in (getpixels bmp [y,0] bmp.width) while not found do found = (c == color)
	)
	found
)
 

@JHN: you might want to delete the comma after my function. I copied it out of a struct, sorry. I made that method in max 2010 and it works for me.
@DenisT: I’ve tested both. Your method checks for pure red color, but can be adjusted for any shade of red, which is what I actually needed.
I’ve tested with two photo’s, both the same, but the second had it’s red channel totally blacked out. For the image with red, both methods had the same speed. When checking the image without red, the getpixel-method was much faster, or more precisely the pastebitmap method took about 100 times as long.

So I’ll be using getpixel for this in the future!
Thanks for the help,
Klaas

Actually, I’ve tested again and must revoke the initial results. The method from denisT contains a slight mistake. The line

(getpixels bmp [y,0] bmp.width)

should be

(getpixels bmp [0,y] bmp.width)

It was only checking the last column of pixels thus was a lot faster and produced the wrong results, since it was basically ignoring most of the image.
Turns out the pastebitmap function is faster, for images with and without red pixels. In both cases about a third faster.