// Information associated to a document.
type JSONInformation = {
patientID: string
+ fileVersion: int
}
// Information associated to each images.
parameters: ParasitemiaCore.Config.Parameters
dateLastAnalysis: DateTime
rbcs: RBC List
+
+ healthyRBCBrightness: float32 // 0 to 1.
+ infectedRBCBrightness: float32 // 0 to 1.
}
type DocumentData = {
let mainEntryName = "info.json"
let imageExtension = ".tiff"
+let currentFileVersion = 1
/// <summary>
/// Save a document in a give file path. The file may already exist.
// Main JSON file.
let mainEntry = file.CreateEntry(mainEntryName, CompressionLevel.Fastest)
use mainEntryWriter = new StreamWriter(mainEntry.Open())
- mainEntryWriter.Write(JsonConvert.SerializeObject({ JSONInformation.patientID = data.patientID }))
+ mainEntryWriter.Write(JsonConvert.SerializeObject({ patientID = data.patientID; fileVersion = currentFileVersion }))
// Write each images and the associated information.
for srcImg in data.images do
let imgJSONEntry = file.CreateEntry(imgFilename + ".json", CompressionLevel.Fastest)
use imgJSONFileWriter = new StreamWriter(imgJSONEntry.Open())
- imgJSONFileWriter.Write(JsonConvert.SerializeObject({ num = srcImg.num; RBCRadius = srcImg.config.RBCRadius.Pixel; parameters = srcImg.config.Parameters; dateLastAnalysis = srcImg.dateLastAnalysis; rbcs = srcImg.rbcs }))
+ imgJSONFileWriter.Write(
+ JsonConvert.SerializeObject(
+ { num = srcImg.num
+ RBCRadius = srcImg.config.RBCRadius.Pixel
+ parameters = srcImg.config.Parameters
+ dateLastAnalysis = srcImg.dateLastAnalysis
+ rbcs = srcImg.rbcs
+ healthyRBCBrightness = srcImg.healthyRBCBrightness
+ infectedRBCBrightness = srcImg.infectedRBCBrightness }))
+
+let updateDocumentData (fromVersion: int) (toVersion: int) (data: DocumentData) : DocumentData =
+ for v in fromVersion + 1 .. toVersion do
+ match v with
+ | 1 -> // Version 0 -> 1 : set initial brightness for rbc.
+ data.images |> List.iter (fun i -> i.healthyRBCBrightness <- 1.f; i.infectedRBCBrightness <- 1.f)
+ | _ -> ()
+ data
/// <summary>
/// Load document from a give file path.
use mainEntryReader = new StreamReader(mainEntry.Open())
let info = JsonConvert.DeserializeObject<JSONInformation>(mainEntryReader.ReadToEnd())
- { patientID = info.patientID
- images = [ let mutable imgNum = 0
- for imgEntry in file.Entries do
- if imgEntry.Name.EndsWith(imageExtension)
- then
- let img = new Image<Bgr, byte>(new System.Drawing.Bitmap(imgEntry.Open(), false)) // FIXME: Should we dispose the bitmap?
- imgNum <- imgNum + 1
- let imgEntry = file.GetEntry(imgEntry.Name + ".json")
- use imgEntryFileReader = new StreamReader(imgEntry.Open())
- let imgInfo = JsonConvert.DeserializeObject<JSONSourceImage>(imgEntryFileReader.ReadToEnd())
- let config = ParasitemiaCore.Config.Config(imgInfo.parameters)
- config.SetRBCRadius imgInfo.RBCRadius
- yield { num = imgNum
- config = config
- dateLastAnalysis = imgInfo.dateLastAnalysis
- img = img
- rbcs = imgInfo.rbcs } ] }
\ No newline at end of file
+ updateDocumentData info.fileVersion currentFileVersion
+ { patientID = info.patientID
+ images = [ let mutable imgNum = 0
+ for imgEntry in file.Entries do
+ if imgEntry.Name.EndsWith(imageExtension)
+ then
+ use bitmap = new System.Drawing.Bitmap(imgEntry.Open(), false)
+ let img = new Image<Bgr, byte>(bitmap)
+ imgNum <- imgNum + 1
+ let imgEntry = file.GetEntry(imgEntry.Name + ".json")
+ use imgEntryFileReader = new StreamReader(imgEntry.Open())
+ let imgInfo = JsonConvert.DeserializeObject<JSONSourceImage>(imgEntryFileReader.ReadToEnd())
+ let config = ParasitemiaCore.Config.Config(imgInfo.parameters)
+ config.SetRBCRadius imgInfo.RBCRadius
+ yield { num = imgNum
+ config = config
+ dateLastAnalysis = imgInfo.dateLastAnalysis
+ img = img
+ rbcs = imgInfo.rbcs
+ healthyRBCBrightness = imgInfo.healthyRBCBrightness
+ infectedRBCBrightness = imgInfo.infectedRBCBrightness } ] }
\ No newline at end of file