saving image trouble
Blitz3D Forums/Blitz3D Beginners Area/saving image trouble
| ||
| Can someone tell me why the saving part of this doesnt work? (there's a lot of fluff code in there, sorry!)
Graphics 1280, 1024, 32, 1
Global imageid, image, bias
Global r, g, b, av, n, m, bw, save, savename
SetBuffer FrontBuffer()
imageid=Input$("Image name and extension : ")
bias=Input$("To what nearest number should the rgb's be rounded to? ")
bw=Input$("Should the output image be black and white? (y/n) ")
;bias = Float bias
;bias = bias/(bias*10)
If bias=0 Then bias=10
image=LoadImage ("image.jpg")
Cls
save=CreateImage(ImageWidth(image), ImageHeight(image))
DrawImage image, 0, 0
DrawImage image, 0, ImageHeight(image)
WaitKey()
For n=0 To ImageWidth (image)
For m=0 To ImageHeight (image)
GetColor n, m
r=ColorRed()
g=ColorGreen()
b=ColorRed()
If bw="y" Then
r=(round( r, bias))
g=(round( g, bias))
b=(round( b, bias))
av = (r + g + b) / 3
r = av : g = av : b = av
Else
r=(round( r, bias))
g=(round( g, bias))
b=(round( b, bias))
EndIf
Color r, g, b
;Plot 1280, 0
Rect 1000, 1000, 2, 2, 1
If ImageHeight(image) < 500 Then
WritePixelFast n, m + ImageHeight (image), ReadPixelFast(1000, 1000)
Else
WritePixel n, m + ImageHeight (image) , ReadPixel(1000, 1000)
EndIf
DrawImage save, 0, ImageHeight(image)
If KeyHit(1) Then Goto endl
Next
Next
CopyRect 0, ImageHeight(image), ImageWidth(image), ImageHeight(image), 0, 0, ImageBuffer(save)
DrawImage save, 0, 0
Repeat
Color 0, 0, 0
Rect 1000, 1000, 280, 24, 1
GetColor MouseX(), MouseY()
Text 1000, 1000, "mouse location rgb = " + ColorRed() + " " + ColorGreen() + " " + ColorBlue()
Text 1000, 900, "Hit spacebar to save the new image, escape to quit"
If KeyHit( 57 ) Then
Locate 900, 980
savename=Input$("New image filename? (will save as bitmap) ")
SaveImage (save, savename+".bmp")
EndIf
Delay 15
Until KeyHit(1)
.endl
End
Function Round( Number , N )
If ( Number Mod N ) >= ( N *.5 )
Number = ( Ceil( Number / N ) + 1 ) * N
Else
Number = Floor( Number / N ) * N
EndIf
Return Number
End Function
Function writepixelsfast()
If ImageHeight(image)*2 > 1024 Then
WritePixelFast n+ImageWidth(image), m, ReadPixelFast(1000, 1000)
Else If ImageWidth*2 > 1280 Then
WritePixelFast n, m+ImageHeight (image), ReadPixelFast(1000, 1000)
EndIf
End Function
Function writepixels()
If ImageHeight(image)*2 > 1024 Then
WritePixel n+ImageWidth(image), m, ReadPixel(1000, 1000)
Else If ImageWidth*2 > 1280 Then
WritePixel n, m+ImageHeight (image), ReadPixel(1000, 1000)
EndIf
End Function
|
| ||
| That depends on what you mean by "doesn't work." Is it just failing to save the image, or are you getting a Runtime Error message? And if so, what does it say? |
| ||
| you could have run the code yourself :). It will save the image, but the saved image will have the correct resolution, but the image will be all black. |
| ||
| you could have run the code yourself :). Nearly everyone who reads your question and looks at the code will give up immediately. They have to supply an image and enter a rounding value with no idea of what it supposed to be. You should at least tell us what you did and what result you got. ...the saved image will have the correct resolution, but the image will be all black. This suggests that the image saved correctly and really is all black. That's the first thing to check. |
| ||
| I'm using copyrect to take the output pixels and put them into point 0, 0 in the image buffer of the image that is saved, these pixels are NOT black. When I copyrect the output pixels the same method onto 0, 0 of the frontbuffer, it shows the correct output image, but for some reason copying them into the imagebuffer and saving the image, will make the image all black. |
| ||
| Should you not be using global variables as you refer to them in functions? I'm not sure. Jim |
| ||
| erm...If i understand you correctly, you are deeply mistaken. Global variables are NEEDED in order to reach into functions. |
| ||
| Sorry bad expression. I'm saying you need to define a variable as Global if you are refering to it in a function. i.e. Global image = .... Jim |
| ||
| I did, didn't I? |
| ||
| nope |
| ||
| every single variable used in the code is a global... |
| ||
| . |
| ||
| Sorry chwaga I missed your declaration at the start. Jim |
| ||
| It maybe something to do with the fact that your ROUND function uses N which is already declared as global. Also, I've no clue what all this readpixel( 1000,1000 ) etc.. is for? |
| ||
| when replacing N with "nu" in the function, it still doesnt work. (readpixel 1000, 1000 is reading the pixels of a rectangle used to view the current drawing color, I didn't want to mess with hex's) |
| ||
| The N in the function eclipses the global n, whilst in the function. However, using such short, non-descript names for globals is a bad idea. ;) Also, Read/WritePixelFast should only be used on locked buffers, and specify the buffer in the call to them, too (I know it's supposed to be an optional param, but I can never get them to work unless I specify the buffer being used). Make sure you're not writing pixels outside of the buffers area, too. |
| ||
| To be frank your code is a bit of a mess. If you don't want to use hex's then readpixelfast and writepixel fast are useless to you and it'd be slow as hell. Here ...
Graphics 1280, 1024, 32, 1
Global IMAGEin = CreateImage( 256,256 ) ;LoadImage( "MyImage.bmp" )
;make a test image
SetBuffer ImageBuffer( IMAGEin )
For x = 0 To 255
For y= 0 To 255
Color Rand(0,255), Rand(0,255), Rand(0,255)
Plot x,y
Next
Next
SetBuffer BackBuffer()
Global IMAGEout = IMAGEprocess( IMAGEin , 10 , True )
Cls
DrawImage IMAGEin, 0,0
DrawImage IMAGEout, 600,0
Flip
WaitKey()
End
;===========================================================================
;===========================================================================
;===========================================================================
Function IMAGEprocess( IMAGEin , Bias=10, BW=False )
IW = ImageWidth( IMAGEin )
IH = ImageHeight( IMAGEin )
IMAGEout = CreateImage( IW , IH )
LockBuffer ImageBuffer( IMAGEin )
LockBuffer ImageBuffer( IMAGEout )
For y = 0 To IH-1
For x = 0 To IW-1
ARGB = ReadPixelFast( x, y , ImageBuffer( IMAGEin ) )
A = ( ARGB And $FF000000 ) Shr 24
R = ( ARGB And $FF0000 ) Shr 16
G = ( ARGB And $FF00 ) Shr 8
B = ( ARGB And $FF )
R = ROUND( R , Bias )
G = ROUND( G , Bias )
B = ROUND( B , Bias )
If BW
AV = ( R + G + B ) / 3
R = AV
G = AV
B = AV
EndIf
ARGB = ( A Shl 24 ) Or ( R Shl 16 ) Or ( G Shl 8 ) Or B
WritePixelFast x, y, ARGB, ImageBuffer( IMAGEout )
Next
Next
UnlockBuffer ImageBuffer( IMAGEin )
UnlockBuffer ImageBuffer( IMAGEout )
Return IMAGEout
End Function
;===========================================================================
;===========================================================================
;===========================================================================
Function Round( Number , N )
If ( Number Mod N ) >= ( N *.5 )
Number = ( Ceil( Number / N ) + 1 ) * N
Else
Number = Floor( Number / N ) * N
EndIf
Return Number
End Function
You may have to limit the R , G , B values so that they don't exceed 255. Stevie |
| ||
Stevie you have beaten me to it but I'll post anyway....
Graphics 1280, 1024, 32, 1
Global imageid$ =Input$("Image name and extension : ")
Global bias$ =Input$("To what nearest number should the rgb's be rounded to? ")
Global bw$ =Input$("Should the output image be black and white? (y/n) ")
Global image=LoadImage ("StarComm.jpg")
Global save=CreateImage(ImageWidth(image), ImageHeight(image))
LockBuffer ImageBuffer(image)
LockBuffer ImageBuffer(save)
;--------------------------------------------------------------------------
For y=0 To ImageHeight (image) - 1
For x=0 To ImageWidth (image) - 1
pix% = ReadPixelFast( x,y, ImageBuffer(image) )
r=(pix% Shr 16) And 255
g=(pix% Shr 8) And 255
b=(pix% Shr 0) And 255
If bw$="y" Then
r=(round( r, bias))
g=(round( g, bias))
b=(round( b, bias))
av = (r + g + b) / 3
r = av : g = av : b = av
Else
r=(round( r, bias))
g=(round( g, bias))
b=(round( b, bias))
EndIf
pix% = (r Shl 16) + (g Shl 8) + b
WritePixelFast x, y, pix%, ImageBuffer(save)
Next
Next
;---------------------------------------------------------------------------
UnlockBuffer ImageBuffer(image)
UnlockBuffer ImageBuffer(save)
savename$=Input$("New image filename? (will save as bitmap) ")
SaveImage (save, savename$+".bmp")
End
Function Round( Number , N )
If ( Number Mod N ) >= ( N *.5 )
Number = ( Ceil( Number / N ) + 1 ) * N
Else
Number = Floor( Number / N ) * N
EndIf
Return Number
End Function
Jim |
| ||
| thanks guys!! (I realize my code was crap, wasn't really thinking when i was doing it, thanks!) Here's Jim's code with a few revisions (the bw code was in the wrong order and done incorrectly fixed that), thanks for all the help guys!
Graphics 1280, 1024, 32, 1
.redo
Locate 0, 0
Cls
Global imageid$ =Input$("Image name and extension (default extension is jpeg) : ")
If imageid$ = "" Then Goto redo
Global bias$ =Input$("To what nearest number should the rgb's be rounded to? ")
Global bw$ =Input$("Should the output image be black and white? (y/n) ")
If bias=256 Then bias=255
If Instr (imageid$, ".", 1) Then
Else
imageid$=imageid$+".jpg"
EndIf
Global image=LoadImage ("" + imageid$)
Global save=CreateImage(ImageWidth(image), ImageHeight(image))
DrawImage image, 0, 0
Locate 700, 1000
LockBuffer ImageBuffer(image)
LockBuffer ImageBuffer(save)
;--------------------------------------------------------------------------
For y=0 To ImageHeight (image) - 1
For x=0 To ImageWidth (image) - 1
pix% = ReadPixelFast( x,y, ImageBuffer(image) )
r=(pix% Shr 16) And 255
g=(pix% Shr 8) And 255
b=(pix% Shr 0) And 255
If bw$="y" Then
av = (r + g + b) / 3
r=(round( av, bias))
g=(round( av, bias))
b=(round( av, bias))
Else
r=(round( r, bias))
g=(round( g, bias))
b=(round( b, bias))
EndIf
pix% = (r Shl 16) + (g Shl 8) + b
WritePixelFast x, y, pix%, ImageBuffer(save)
Next
Next
;---------------------------------------------------------------------------
UnlockBuffer ImageBuffer(image)
UnlockBuffer ImageBuffer(save)
If ImageHeight(image)*2 > GraphicsHeight() Then
DrawImage save, ImageWidth(image), 0
Else
DrawImage save, 0, ImageHeight(image), 0
EndIf
savename$=Input$("New image filename? (will save as bitmap, supply no name to not save) ")
If savename$="" Then
Else
SaveImage (save, savename$+".bmp")
EndIf
FlushKeys()
Repeat
Text 800, 980, "Press Escape to Exit, Space to reset."
If KeyHit(57) Then Goto redo
Until KeyHit(1)
End
Function Round( Number , N )
If ( Number Mod N ) >= ( N *.5 )
Number = ( Ceil( Number / N ) + 1 ) * N
Else
Number = Floor( Number / N ) * N
EndIf
Return Number
End Function
...so, from what I'm reading in the code, using r=(pix% Shr 16) And 255 g=(pix% Shr 8) And 255 b=(pix% Shr 0) And 255and pix% = (r Shl 16) + (g Shl 8) + bmakes it hex? |
| ||
| http://en.wikipedia.org/wiki/Hexadecimal check out binary aswell. Jim |