Image noise
Generate a random black and white image continuously, showing FPS (frames per second).
You are encouraged to solve this task according to the task description, using any language you may know.
Sample image:
C#
<lang csharp>using System; using System.Windows.Forms; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Linq; using System.ComponentModel; using System.Collections.Generic;
class Program {
static int[] colors = { 0, 255 }; static Size size = new Size(320, 240); static Rectangle rectsize = new Rectangle(new Point(0, 0), size); static int numbytes = size.Width * size.Height * 3;
static PictureBox pb; static BackgroundWorker worker;
static double time = 0; static double frames = 0; static Random rand = new Random();
static IEnumerable<byte> YieldVodoo(int numpixels) { // Yield 3 times same number (i.e 255 255 255) for numpixels/3 times. // Numpixels is number of pixels, it's divided by 3 because it's a RGB image.
for (int i = 0; i < numpixels / 3; i++) { var tmp = colors[rand.Next(colors.Length)];
for (int j = 0; j < 3; j++) { yield return (byte)tmp; } } }
static Image Randimg() { // Low-level bitmaps
var bitmap = new Bitmap(size.Width, size.Height); var data = bitmap.LockBits(rectsize, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); var yielder = YieldVodoo(numbytes);
Marshal.Copy( yielder.ToArray<byte>(), // source 0, // start data.Scan0, // scan0 is a pointer to low-level bitmap data numbytes /* number of bytes to write*/);
bitmap.UnlockBits(data); return bitmap; }
static void Main() { // TODO: Fix form size.
var form = new Form(); form.AutoSize = true; form.Text = "Test"; form.FormClosed += delegate { Application.Exit(); };
worker = new BackgroundWorker(); worker.DoWork += delegate { while (true) { try { var a = DateTime.Now; pb.Image = Randimg(); var b = DateTime.Now;
time += (b - a).TotalSeconds; frames += 1;
if (frames == 30) { Console.WriteLine("{0} frames in {1:0.00} seconds. ({2:0} FPS)", frames, time, frames / time);
time = 0; frames = 0; } } catch { // Just pass. } } }; worker.RunWorkerAsync();
pb = new PictureBox(); pb.Size = size; //pb.Dock = DockStyle.Bottom;
form.Controls.Add(pb); form.Show();
Application.Run(); }
}</lang>
Factor
Still learning Factor, my code may suck, please fix.
By some reason, FPS does not show during execution on Linux.
<lang factor>USING: namespaces ui ui.gadgets ui.gadgets.buttons ui.gadgets.tracks ui.gadgets.borders images images.viewer models timers accessors kernel sequences sequences.deep byte-vectors random calendar io math math.functions math.parser prettyprint debugger system ; FROM: models => change-model ;
IN: imagenoise
TUPLE: imgmodel < model content ; SYMBOL: dispimg SYMBOL: num SYMBOL: ttime
- randimg ( -- img )
<image> { 320 240 } >>dim RGB >>component-order ubyte-components >>component-type
dup dim>> product [ { 255 0 } random 3 swap <repetition> ] replicate flatten >byte-vector >>bitmap ;
randimg imgmodel new-model dispimg set-global 0 num set-global 0 ttime set-global
[
now
dispimg get-global [ drop randimg ] change-model num get-global 1 + num set-global now swap time- duration>seconds ttime get-global + ttime set-global num get-global 10 <= [ ] [ num get-global ttime get-global [ / round number>string " FPS" append ] try print
0 num set-global 0 ttime set-global ] if
] 1 nanoseconds every
[ vertical <track>
dispimg get-global <image-control> { 5 5 } <border> f track-add "Test" open-window
] with-ui</lang>
Python
<lang python>import Tkinter import Image, ImageTk import random import time
colors = [(0,0,0),(255,255,255)] size = (320,240) pixels = size[0] * size[1]
class App():
def __init__(self, root): self.root = root self.root.title("Test") self.img = Image.new("RGB",size) self.label = Tkinter.Label(root) self.label.pack()
self.time = 0.0 self.frames = 0 self.loop() def loop(self): self.ta = time.time() self.img.putdata([random.choice(colors) for i in range(pixels)]) self.pimg = ImageTk.PhotoImage(self.img) self.label["image"] = self.pimg self.tb = time.time() self.time += (self.tb - self.ta) self.frames += 1
if self.frames == 30: try: self.fps = self.frames / self.time except: self.fps = "INSTANT" print "%d frames in %3.2f seconds (%s FPS)" % (self.frames, self.time, self.fps) self.time = 0 self.frames = 0 self.root.after(1, self.loop)
root = Tkinter.Tk() app = App(root) root.mainloop()</lang>
Tcl
<lang tcl>package require Tk
proc generate {img width height} {
set data {} for {set i 0} {$i<$height} {incr i} {
set line {} for {set j 0} {$j<$width} {incr j} { lappend line [lindex "#000000 #FFFFFF" [expr {rand() < 0.5}]] } lappend data $line
} $img put $data
}
set time 0.0 set count 0
proc looper {} {
global time count set t [lindex [time {generate noise 320 240}] 0] set time [expr {$time + $t}] if {[incr count] >= 30} {
set time [expr {$time / 1000000.0}] set fps [expr {$count / $time}] puts [format "%d frames in %3.2f seconds (%f FPS)" $count $time $fps] set time 0.0 set count 0
} after 1 looper
}
image create photo noise -width 320 -height 240 pack [label .l -image noise] update looper</lang>