The purpose of this repository is to provide a way for people to create placeholder images quickly.
https://www.craigoates.net/Software/project/11
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
3.4 KiB
82 lines
3.4 KiB
module internal InternalServices |
|
|
|
open System.IO |
|
open System.Drawing |
|
open SmoulderingBeachBall.Domain |
|
|
|
module Validation = |
|
|
|
let validateDimension dimension = |
|
match dimension with |
|
| dimension when dimension <= 0 -> |
|
invalidArg "dimension" "[ERROR] The images height and width must be greater than 0." |
|
| _ -> () |
|
|
|
let validateDirectory filePath = |
|
let path = Path.GetDirectoryName filePath |
|
match (Directory.Exists path) with |
|
| false -> |
|
invalidArg "filePath" "[ERROR] Unable to save to the specified location because it could not be found." |
|
| true -> () |
|
|
|
module Drawing = |
|
open System.Text |
|
|
|
let penOffset penWidth = int (penWidth / (float32 2)) |
|
|
|
let setPenWidth imgWidth imgHeight = |
|
let width = float32 imgWidth |
|
let height = float32 imgHeight |
|
if (width >= height) then |
|
height * (float32 0.05) |
|
else width * (float32 0.05) |
|
|
|
let createBorderPath penWidth spec = |
|
let offset = penOffset penWidth |
|
[|Point (0, offset); // Essentially (0, 0) |
|
Point ((spec.width - offset), offset); |
|
Point ((spec.width - offset), (spec.height - offset)); |
|
Point (offset, (spec.height - offset)); |
|
Point (offset, 0)|] |
|
|
|
let drawBorder (graphics: Graphics) (pen: Pen) spec = |
|
printfn "[INFO.] Adding border to image..." |
|
let penPath = createBorderPath pen.Width spec |
|
graphics.DrawLines (pen, penPath) |
|
|
|
let drawFullOverlay (graphics: Graphics) (pen: Pen) spec = |
|
drawBorder graphics pen spec |
|
printfn "[INFO.] Adding full overlay to image..." |
|
let offset = penOffset pen.Width |
|
// Draws line from top-left to bottom-right of square. |
|
graphics.DrawLine (pen, offset, offset, (spec.width - offset), (spec.height - offset)) |
|
// Draws line from top-right to bottom-left of square. |
|
graphics.DrawLine (pen, (spec.width - offset), offset, offset, (spec.height - offset)) |
|
|
|
let addOverlayToImage graphics spec = |
|
let overlay = spec.overlay.Value |
|
let pen = |
|
new Pen (overlay.colour, width = (setPenWidth spec.width spec.height)) |
|
match overlay.overlayType with |
|
| Border -> drawBorder graphics pen spec |
|
| Full -> drawFullOverlay graphics pen spec |
|
|
|
let buildFileName spec = |
|
let sb = new StringBuilder () |
|
sb.Append (spec.width.ToString ()) |> ignore |
|
sb.Append "x" |> ignore |
|
sb.Append (spec.height.ToString ()) |> ignore |
|
sb.Append ".png" |> ignore |
|
(sb.ToString ()) |
|
|
|
let drawImage spec = |
|
let bitmap = new Bitmap (spec.width, spec.height) |
|
let graphics = Graphics.FromImage (bitmap) |
|
let rectangle = Rectangle (0, 0, spec.width, spec.height) |
|
graphics.FillRectangle (spec.colour, rectangle) |
|
match spec.overlay.IsSome with |
|
| true -> addOverlayToImage graphics spec |
|
| false -> printfn "[INFO.] No overlay specified. Creating image without one." |
|
bitmap.Save (Path.Combine (spec.filePath, (buildFileName spec))) |
|
graphics.Dispose() |
|
bitmap.Dispose() |