2 people like it.
Like the snippet!
Bitmap Primitives Helpers
Bitmap primitives helper functions for manipulating bitmap in memory as an array of tuples (x,y,color).
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
|
(*
* Bitmap Primitives Helpers
* Partly inspired by http://fssnip.net/si.
*)
open System.Drawing
// deserialize a bitmap file
let fromFile (name : string) = new Bitmap(name)
// serialize a bitmap as png
let toFile (name : string) (bmp: Bitmap) =
bmp.Save(name, Imaging.ImageFormat.Png) |> ignore
bmp
// load a bitmap in array of tuples (x,y,Color)
let toRgbArray (bmp : Bitmap) =
[| for y in 0..bmp.Height-1 do
for x in 0..bmp.Width-1 -> x,y,bmp.GetPixel(x,y) |]
// builds a bitmap instance from an array of tuples
let toBitmap a =
let height = (a |> Array.Parallel.map (fun (x,_,_) -> x) |> Array.max) + 1
let width = (a |> Array.Parallel.map (fun (_,y,_) -> y) |> Array.max) + 1
let bmp = new Bitmap(width, height)
a |> Array.Parallel.iter (fun (x,y,c) -> bmp.SetPixel(x,y,c))
bmp
// converts an image to gray scale
let toGrayScale a =
a |> Array.Parallel.map (
fun (x,y,c : System.Drawing.Color) ->
let gscale = int((float c.R * 0.3) + (float c.G * 0.59) + (float c.B * 0.11))
in x,y,Color.FromArgb(int c.A, gscale, gscale, gscale))
// randomize or R or G or B each 1 to 3 pixels
let randomColorize a =
let rnd = new System.Random()
let next = fun() -> rnd.Next(255)
let rgb = function
| 0 -> fun(c : System.Drawing.Color) -> Color.FromArgb(int c.A, next(), (int c.G), (int c.B))
| 1 -> fun(c) -> Color.FromArgb(int c.A, (int c.R), next(), (int c.B))
| _ -> fun(c) -> Color.FromArgb(int c.A, (int c.R), (int c.G), next())
a |> Array.Parallel.mapi (
fun i (x,y,c : System.Drawing.Color) ->
if i % rnd.Next(1,3) = 0 then x,y, rgb(rnd.Next(2))(c)
else x,y,c)
(*
* Usage example:
*)
let convertImage =
use newBitmap =
fromFile @"C:/Temp/with-color.jpg"
|> toRgbArray
|> toGrayScale // or custom in memory manipulation function
|> toBitmap
use savedBitmap =
toFile @"C:/Temp/gray-scale.png" newBitmap
()
|
namespace System
namespace System.Drawing
val fromFile : name:string -> Bitmap
Full name: Script.fromFile
val name : string
Multiple items
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = System.String
Full name: Microsoft.FSharp.Core.string
Multiple items
type Bitmap =
inherit Image
new : filename:string -> Bitmap + 11 overloads
member Clone : rect:Rectangle * format:PixelFormat -> Bitmap + 1 overload
member GetHbitmap : unit -> nativeint + 1 overload
member GetHicon : unit -> nativeint
member GetPixel : x:int * y:int -> Color
member LockBits : rect:Rectangle * flags:ImageLockMode * format:PixelFormat -> BitmapData + 1 overload
member MakeTransparent : unit -> unit + 1 overload
member SetPixel : x:int * y:int * color:Color -> unit
member SetResolution : xDpi:float32 * yDpi:float32 -> unit
member UnlockBits : bitmapdata:BitmapData -> unit
...
Full name: System.Drawing.Bitmap
--------------------
Bitmap(filename: string) : unit
(+0 other overloads)
Bitmap(stream: System.IO.Stream) : unit
(+0 other overloads)
Bitmap(original: Image) : unit
(+0 other overloads)
Bitmap(filename: string, useIcm: bool) : unit
(+0 other overloads)
Bitmap(type: System.Type, resource: string) : unit
(+0 other overloads)
Bitmap(stream: System.IO.Stream, useIcm: bool) : unit
(+0 other overloads)
Bitmap(width: int, height: int) : unit
(+0 other overloads)
Bitmap(original: Image, newSize: Size) : unit
(+0 other overloads)
Bitmap(width: int, height: int, format: Imaging.PixelFormat) : unit
(+0 other overloads)
Bitmap(width: int, height: int, g: Graphics) : unit
(+0 other overloads)
val toFile : name:string -> bmp:Bitmap -> Bitmap
Full name: Script.toFile
val bmp : Bitmap
Image.Save(filename: string) : unit
Image.Save(stream: System.IO.Stream, format: Imaging.ImageFormat) : unit
Image.Save(filename: string, format: Imaging.ImageFormat) : unit
Image.Save(stream: System.IO.Stream, encoder: Imaging.ImageCodecInfo, encoderParams: Imaging.EncoderParameters) : unit
Image.Save(filename: string, encoder: Imaging.ImageCodecInfo, encoderParams: Imaging.EncoderParameters) : unit
namespace System.Drawing.Imaging
Multiple items
type ImageFormat =
new : guid:Guid -> ImageFormat
member Equals : o:obj -> bool
member GetHashCode : unit -> int
member Guid : Guid
member ToString : unit -> string
static member Bmp : ImageFormat
static member Emf : ImageFormat
static member Exif : ImageFormat
static member Gif : ImageFormat
static member Icon : ImageFormat
...
Full name: System.Drawing.Imaging.ImageFormat
--------------------
Imaging.ImageFormat(guid: System.Guid) : unit
property Imaging.ImageFormat.Png: Imaging.ImageFormat
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
val toRgbArray : bmp:Bitmap -> (int * int * Color) []
Full name: Script.toRgbArray
val y : int
property Image.Height: int
val x : int
property Image.Width: int
Bitmap.GetPixel(x: int, y: int) : Color
val toBitmap : a:(int * int * Color) [] -> Bitmap
Full name: Script.toBitmap
val a : (int * int * Color) []
val height : int
module Array
from Microsoft.FSharp.Collections
module Parallel
from Microsoft.FSharp.Collections.ArrayModule
val map : mapping:('T -> 'U) -> array:'T [] -> 'U []
Full name: Microsoft.FSharp.Collections.ArrayModule.Parallel.map
val max : array:'T [] -> 'T (requires comparison)
Full name: Microsoft.FSharp.Collections.Array.max
val width : int
val iter : action:('T -> unit) -> array:'T [] -> unit
Full name: Microsoft.FSharp.Collections.ArrayModule.Parallel.iter
val c : Color
Bitmap.SetPixel(x: int, y: int, color: Color) : unit
val toGrayScale : a:('a * 'b * Color) [] -> ('a * 'b * Color) []
Full name: Script.toGrayScale
val a : ('a * 'b * Color) []
val x : 'a
val y : 'b
type Color =
struct
member A : byte
member B : byte
member Equals : obj:obj -> bool
member G : byte
member GetBrightness : unit -> float32
member GetHashCode : unit -> int
member GetHue : unit -> float32
member GetSaturation : unit -> float32
member IsEmpty : bool
member IsKnownColor : bool
...
end
Full name: System.Drawing.Color
val gscale : int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = System.Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
property Color.R: byte
property Color.G: byte
property Color.B: byte
Color.FromArgb(argb: int) : Color
Color.FromArgb(alpha: int, baseColor: Color) : Color
Color.FromArgb(red: int, green: int, blue: int) : Color
Color.FromArgb(alpha: int, red: int, green: int, blue: int) : Color
property Color.A: byte
val randomColorize : a:('a * 'b * Color) [] -> ('a * 'b * Color) []
Full name: Script.randomColorize
val rnd : System.Random
Multiple items
type Random =
new : unit -> Random + 1 overload
member Next : unit -> int + 2 overloads
member NextBytes : buffer:byte[] -> unit
member NextDouble : unit -> float
Full name: System.Random
--------------------
System.Random() : unit
System.Random(Seed: int) : unit
val next : (unit -> int)
System.Random.Next() : int
System.Random.Next(maxValue: int) : int
System.Random.Next(minValue: int, maxValue: int) : int
val rgb : (int -> Color -> Color)
val mapi : mapping:(int -> 'T -> 'U) -> array:'T [] -> 'U []
Full name: Microsoft.FSharp.Collections.ArrayModule.Parallel.mapi
val i : int
val convertImage : unit
Full name: Script.convertImage
val newBitmap : Bitmap
val savedBitmap : Bitmap
More information