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

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()