Flip Image

Blitz3D Forums/Blitz3D Programming/Flip Image

maverick69(Posted 2005) [#1]
Hello.

I have written a little routine to flip a image and save it to a new file. Everything works fine except one little bug, and I am not able to find it.

If I flip an image vertical the new image will have wrong pixels at the first line (y=0). If I flip an image horizontal I have wrong pixels at the first column (x=0).

I'm really going mad - hope someone could help me. Here is the code:

Function FlipImg(infile$,outfile$,horz, verz)
	Local img = LoadImage(infile$)
	
	Local w = ImageWidth(img)
	Local h = ImageHeight(img)
	
	Local newimage = CreateImage(w,h)
	
	LockBuffer ImageBuffer(img)
	LockBuffer ImageBuffer(newimage)
		
	For y=0 To h
		For x=0 To w
			pix = ReadPixelFast(x,y,ImageBuffer(img))					
			If horz=1 And verz=0 Then WritePixelFast(w-x,y,pix,ImageBuffer(newimage))
			If horz=0 And verz=1 Then WritePixelFast(x,h-y,pix,ImageBuffer(newimage))
			If horz=1 And verz=1 Then WritePixelFast(w-x,h-y,pix,ImageBuffer(newimage))
		Next		
	Next
	
	UnlockBuffer ImageBuffer(img)
	UnlockBuffer ImageBuffer(newimage)
	
	SaveBuffer (ImageBuffer(newimage),outfile$)
	
	FreeImage img
	FreeImage newimage
	
End Function



DJWoodgate(Posted 2005) [#2]
For y=0 To h-1
    For x=0 To w-1
	pix = ReadPixelFast(x,y,ImageBuffer(img))
	If horz=1 And verz=0 Then WritePixelFast(w-x-1,y,pix,ImageBuffer(newimage))
	If horz=0 And verz=1 Then WritePixelFast(x,h-y-1,pix,ImageBuffer(newimage))
	If horz=1 And verz=1 Then WritePixelFast(w-x-1,h-y-1,pix,ImageBuffer(newimage))
    Next
Next

;or
h=h-1 : w=w-1

For y=0 To h
    For x=0 To w
	pix = ReadPixelFast(x,y,ImageBuffer(img))
	If horz=1 And verz=0 Then WritePixelFast(w-x,y,pix,ImageBuffer(newimage))
	If horz=0 And verz=1 Then WritePixelFast(x,h-y,pix,ImageBuffer(newimage))
	If horz=1 And verz=1 Then WritePixelFast(w-x,h-y,pix,ImageBuffer(newimage))
    Next		
Next

;or

Function FlipImg(infile$,outfile$,horz, verz)
	Local img = LoadImage(infile$)
	
	TFormFilter False
	ScaleImage img,1-2*(horz=True),1-2*(verz=True)
	
	SaveBuffer (ImageBuffer(img),outfile$)
	
	FreeImage img
	
End Function



maverick69(Posted 2005) [#3]
Thank you. I have tried various things now and the following code seems to work, but I don't know why. If someone knows it would be nice if he can post it here :-)

			If horz=1 And verz=0 Then pix = ReadPixelFast(x-1,y,ImageBuffer(img)) : WritePixelFast(w-x,y,pix,ImageBuffer(newimage))
			If horz=0 And verz=1 Then pix = ReadPixelFast(x,y-1,ImageBuffer(img)) : WritePixelFast(x,h-y,pix,ImageBuffer(newimage))
			If horz=1 And verz=1 Then pix = ReadPixelFast(x-1,y-1,ImageBuffer(img)) : WritePixelFast(w-x,h-y,pix,ImageBuffer(newimage))



DJWoodgate(Posted 2005) [#4]
Can't see how that works correctly since it reads before the first pixel?

Here are some other possibilites. May still need some work though.

Function FlipImg2(infile$,outfile$,horz, verz)
	Local image,w,h,himg,vimg,ibuf,hbuf,vbuf,centre
	image=LoadImage(infile)
	w = ImageWidth(image)
	h = ImageHeight(image)
	himg = CreateImage(w,1)
	vimg = CreateImage(1,h)
	ibuf = ImageBuffer(image)
	hbuf = ImageBuffer(himg)
	vbuf = ImageBuffer(vimg)

	If horz Then
                centre = (w-1)/2
		For x=0 To centre
			CopyRect x,0,1,h, 0,0,ibuf,vbuf
			CopyRect w-x-1,0,1,h, x,0,ibuf,ibuf
			CopyRect 0,0,1,h, w-x-1,0,vbuf,ibuf
		Next
	EndIf
	If verz Then
                centre = (h-1)/2
		For y=0 To centre
			CopyRect 0,y,w,1, 0,0,ibuf,hbuf
			CopyRect 0,h-y-1,w,1, 0,y,ibuf,ibuf
			CopyRect 0,0,w,1, 0,h-y-1,hbuf,ibuf
		Next
	EndIf
	
	SaveBuffer (ibuf,outfile$)

	FreeImage himg
	FreeImage vimg
	Freeimage image
	
End Function

; or a simpler version, but slower here for large images due to use of copyimage.
Function FlipImg2a(infile$,outfile$,horz, verz)
	Local image,w,h,himg,vimg,ibuf,hbuf,vbuf
	image=LoadImage(infile)
	w = ImageWidth(image)
	h = ImageHeight(image)
	tempimage = CopyImage(image)
	ibuf = ImageBuffer(image)
	tbuf = ImageBuffer(tempimage)

	If horz Then
		For x=0 To w-1
			CopyRect x,0,1,h, w-x-1,0,ibuf,tbuf
		Next
	EndIf
	If verz Then
		For y=0 To h-1
			CopyRect 0,y,w,1, 0,h-y-1,tbuf,ibuf
		Next
	EndIf
	
	If verz Then SaveBuffer (ibuf,outfile$) Else SaveBuffer(tbuf,outfile$)
	
        Freeimage image
	Freeimage tempimage
End Function

; the little used copypixelfast.
Function FlipImg4(infile$,outfile$,horz, verz)
	Local img,w,h,newimage,ibuf,nbuf
	img=LoadImage(infile$)
	ibuf = ImageBuffer(img)
	w = ImageWidth(img)
	h = ImageHeight(img)
	newimage = CreateImage(w,h)
	nbuf=ImageBuffer(newimage)

	LockBuffer ibuf
	LockBuffer nbuf
	
	h=h-1 : w=w-1
		
	If horz=1 And verz=0 Then  For y=0 To h : For x=0 To w : CopyPixelFast x,y,ibuf,w-x,y,nbuf : Next : Next
	If horz=0 And verz=1 Then  For y=0 To h : For x=0 To w : CopyPixelFast x,y,ibuf,x,h-y,nbuf : Next : Next
	If horz=1 And verz=1 Then  For y=0 To h : For x=0 To w : CopyPixelFast x,y,ibuf,w-x,h-y,nbuf : Next : Next
	UnlockBuffer nbuf
	UnlockBuffer ibuf

	
	SaveBuffer (ImageBuffer(newimage),outfile$)
	
	FreeImage img
        Freeimage newimage