Text Only
|
Text with Attachments
QB64.org Forum
Active Forums => Programs => Topic started by: MrFreyer on November 06, 2019, 03:31:34 am
Title:
Mosaic Effect
Post by:
MrFreyer
on
November 06, 2019, 03:31:34 am
...it's the mosaic effect, like the SNES games used it to pixelate (blur?) the screen.
Code: QB64:
[Select]
DEFINT
A
-
Z
RANDOMIZE
TIMER
desktopscreen.
width
=
_DESKTOPWIDTH
desktopscreen.height
=
_DESKTOPHEIGHT
screenwindow.
width
=
800
screenwindow.height
=
600
SCREEN
_NEWIMAGE
(
screenwindow.
width
,
screenwindow.height
,
32
)
DO
:
LOOP
UNTIL
_SCREENEXISTS
_SCREENMOVE
(
desktopscreen.
width
*
0.5
-
screenwindow.
width
*
0.5
)
,
0
_DISPLAY
CONST
pixelbytes
=
4
'4 byte per pixel (RGBA)
DIM
pixelcolorRed
AS
_UNSIGNED
_BYTE
DIM
pixelcolorGreen
AS
_UNSIGNED
_BYTE
DIM
pixelcolorBlue
AS
_UNSIGNED
_BYTE
DIM
imageScreenMEMORY
AS
_MEM
mosaicSize
=
1
'calculate maximum mosaic tiles
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
DO
CLS
LINE
(
0
,
0
)
-
(
screenwindow.
width
-
1
,
screenwindow.height
-
1
)
,
_RGB
(
255
,
255
,
95
)
,
BF
_FONT
16
COLOR
_RGB
(
255
,
0
,
255
)
,
_RGB
(
255
,
255
,
255
)
_PRINTSTRING
(
32
,
0
)
,
"Explanation:"
COLOR
_RGB
(
255
,
191
,
0
)
,
_RGB
(
191
,
95
,
0
)
_PRINTSTRING
(
32
,
64
)
,
"This program shows the Mosaic Effect."
COLOR
_RGB
(
0
,
255
,
0
)
,
_RGB
(
0
,
0
,
63
)
_PRINTSTRING
(
32
,
128
)
,
"But it's the old version, like the Super Nintendo Entertainment System used it."
COLOR
_RGB
(
191
,
191
,
191
)
,
_RGB
(
191
,
63
,
0
)
_PRINTSTRING
(
32
,
192
)
,
"The old version takes just the color of a pixel"
COLOR
_RGB
(
95
,
63
,
95
)
,
_RGB
(
0
,
255
,
193
)
_PRINTSTRING
(
32
,
256
)
,
"and overwrites the next few pixels on the x and y axis"
COLOR
_RGB
(
0
,
191
,
127
)
,
_RGB
(
255
,
0
,
0
)
_PRINTSTRING
(
32
,
320
)
,
"with the color values of the first pixel."
COLOR
_RGB
(
0
,
255
,
123
)
,
_RGB
(
31
,
95
,
31
)
_PRINTSTRING
(
32
,
384
)
,
"There is also a newer, smooth version, but who needs it? :D"
COLOR
_RGB
(
255
,
255
,
255
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
32
,
448
)
,
"Just press [+] or [-] to change the mosaic size."
COLOR
_RGB
(
255
,
95
,
95
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
464
,
448
)
,
"<<< change mosaic size"
COLOR
_RGB
(
0
,
0
,
0
)
,
_RGB
(
63
,
127
,
63
)
_PRINTSTRING
(
32
,
512
)
,
"Press [Escape] to close the program."
COLOR
_RGB
(
255
,
95
,
95
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
464
,
512
)
,
"<<< close program"
COLOR
_RGB
(
255
,
0
,
0
)
,
_RGB
(
31
,
31
,
31
)
_PRINTSTRING
(
32
,
576
)
,
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X"
imageScreenMEMORY
=
_MEMIMAGE
(
0
)
FOR
pixelVertical
=
1
TO
mosaicsVertical
FOR
pixelHorizontal
=
1
TO
mosaicsHorizontal
y
=
(
pixelVertical
-
1
)
*
mosaicSize
x
=
(
pixelHorizontal
-
1
)
*
mosaicSize
_MEMGET
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
x
*
pixelbytes
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorRed
_MEMGET
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
(
x
*
pixelbytes
)
+
1
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorGreen
_MEMGET
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
(
x
*
pixelbytes
)
+
2
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorBlue
FOR
y2
=
0
TO
mosaicSize
-
1
FOR
x2
=
0
TO
mosaicSize
-
1
_MEMPUT
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
x
*
pixelbytes
)
+
(
x2
*
pixelbytes
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
+
(
y2
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorRed
_MEMPUT
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
(
x
*
pixelbytes
)
+
1
)
+
(
x2
*
pixelbytes
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
+
(
y2
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorGreen
_MEMPUT
imageScreenMEMORY
,
imageScreenMEMORY .OFFSET
+
(
(
x
*
pixelbytes
)
+
2
)
+
(
x2
*
pixelbytes
)
+
(
y
*
(
screenwindow.
width
*
pixelbytes
)
)
+
(
y2
*
(
screenwindow.
width
*
pixelbytes
)
)
,
pixelcolorBlue
NEXT
x2
NEXT
y2
NEXT
pixelHorizontal
NEXT
pixelVertical
_DISPLAY
WHILE
INKEY$
<>
""
:
WEND
DO
keypressed$
=
INKEY$
IF
keypressed$
=
CHR$
(
43
)
THEN
mosaicSize
=
mosaicSize
+
1
IF
mosaicSize
>
64
THEN
mosaicSize
=
64
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
EXIT
DO
END
IF
IF
keypressed$
=
CHR$
(
45
)
THEN
mosaicSize
=
mosaicSize
-
1
IF
mosaicSize
<
1
THEN
mosaicSize
=
1
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
EXIT
DO
END
IF
IF
keypressed$
=
CHR$
(
27
)
THEN
GOTO
close_program
LOOP
LOOP
close_program:
SYSTEM
END
EDIT:
...and here the slightly slower version, but with POINT/ PRESET instead of _MEMGET/ _MEMPUT
Code: QB64:
[Select]
DEFINT
A
-
Z
RANDOMIZE
TIMER
desktopscreen.
width
=
_DESKTOPWIDTH
desktopscreen.height
=
_DESKTOPHEIGHT
screenwindow.
width
=
800
screenwindow.height
=
600
SCREEN
_NEWIMAGE
(
screenwindow.
width
,
screenwindow.height
,
32
)
DO
:
LOOP
UNTIL
_SCREENEXISTS
_SCREENMOVE
(
desktopscreen.
width
*
0.5
-
screenwindow.
width
*
0.5
)
,
0
_DISPLAY
DIM
pixelcolor
AS
LONG
DIM
pixelcolorRed
AS
_UNSIGNED
_BYTE
DIM
pixelcolorGreen
AS
_UNSIGNED
_BYTE
DIM
pixelcolorBlue
AS
_UNSIGNED
_BYTE
mosaicSize
=
1
'calculate maximum mosaic tiles
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
DO
CLS
LINE
(
0
,
0
)
-
(
screenwindow.
width
-
1
,
screenwindow.height
-
1
)
,
_RGB
(
255
,
255
,
95
)
,
BF
_FONT
16
COLOR
_RGB
(
255
,
0
,
255
)
,
_RGB
(
255
,
255
,
255
)
_PRINTSTRING
(
32
,
0
)
,
"Explanation:"
COLOR
_RGB
(
255
,
191
,
0
)
,
_RGB
(
191
,
95
,
0
)
_PRINTSTRING
(
32
,
64
)
,
"This program shows the Mosaic Effect."
COLOR
_RGB
(
0
,
255
,
0
)
,
_RGB
(
0
,
0
,
63
)
_PRINTSTRING
(
32
,
128
)
,
"But it's the old version, like the Super Nintendo Entertainment System used it."
COLOR
_RGB
(
191
,
191
,
191
)
,
_RGB
(
191
,
63
,
0
)
_PRINTSTRING
(
32
,
192
)
,
"The old version takes just the color of a pixel"
COLOR
_RGB
(
95
,
63
,
95
)
,
_RGB
(
0
,
255
,
193
)
_PRINTSTRING
(
32
,
256
)
,
"and overwrites the next few pixels on the x and y axis"
COLOR
_RGB
(
0
,
191
,
127
)
,
_RGB
(
255
,
0
,
0
)
_PRINTSTRING
(
32
,
320
)
,
"with the color values of the first pixel."
COLOR
_RGB
(
0
,
255
,
123
)
,
_RGB
(
31
,
95
,
31
)
_PRINTSTRING
(
32
,
384
)
,
"There is also a newer, smooth version, but who needs it? :D"
COLOR
_RGB
(
255
,
255
,
255
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
32
,
448
)
,
"Just press [+] or [-] to change the mosaic size."
COLOR
_RGB
(
255
,
95
,
95
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
464
,
448
)
,
"<<< change mosaic size"
COLOR
_RGB
(
0
,
0
,
0
)
,
_RGB
(
63
,
127
,
63
)
_PRINTSTRING
(
32
,
512
)
,
"Press [Escape] to close the program."
COLOR
_RGB
(
255
,
95
,
95
)
,
_RGB
(
0
,
0
,
0
)
_PRINTSTRING
(
464
,
512
)
,
"<<< close program"
COLOR
_RGB
(
255
,
0
,
0
)
,
_RGB
(
31
,
31
,
31
)
_PRINTSTRING
(
32
,
576
)
,
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X"
FOR
pixelVertical
=
1
TO
mosaicsVertical
FOR
pixelHorizontal
=
1
TO
mosaicsHorizontal
y
=
(
pixelVertical
-
1
)
*
mosaicSize
x
=
(
pixelHorizontal
-
1
)
*
mosaicSize
pixelcolor
=
POINT
(
x
,
y
)
pixelcolorRed
=
_RED32
(
pixelcolor
)
pixelcolorGreen
=
_GREEN32
(
pixelcolor
)
pixelcolorBlue
=
_BLUE32
(
pixelcolor
)
FOR
y2
=
0
TO
mosaicSize
-
1
FOR
x2
=
0
TO
mosaicSize
-
1
PRESET
(
x
+
x2
,
y
+
y2
)
,
_RGB
(
pixelcolorRed
,
pixelcolorGreen
,
pixelcolorBlue
)
NEXT
x2
NEXT
y2
NEXT
pixelHorizontal
NEXT
pixelVertical
_DISPLAY
WHILE
INKEY$
<>
""
:
WEND
DO
keypressed$
=
INKEY$
IF
keypressed$
=
CHR$
(
43
)
THEN
mosaicSize
=
mosaicSize
+
1
IF
mosaicSize
>
64
THEN
mosaicSize
=
64
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
EXIT
DO
END
IF
IF
keypressed$
=
CHR$
(
45
)
THEN
mosaicSize
=
mosaicSize
-
1
IF
mosaicSize
<
1
THEN
mosaicSize
=
1
mosaicsVertical
=
FIX
(
screenwindow.height
/
mosaicSize
)
mosaicsHorizontal
=
FIX
(
screenwindow.
width
/
mosaicSize
)
EXIT
DO
END
IF
IF
keypressed$
=
CHR$
(
27
)
THEN
GOTO
close_program
LOOP
LOOP
close_program:
SYSTEM
END
Text Only
|
Text with Attachments