X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FGUI%2FPiaZ.fs;h=d551b8d720ca7b6e0656c7fe2dd78ce003ddf7ab;hb=aaa250fab2ac3227bf45704355d389bc1a4ee7fc;hp=a373e53454009df41393e793e80ce47c7cca1c58;hpb=8013d6a586604e443332e6e9a715c86df444a875;p=master-thesis.git diff --git a/Parasitemia/Parasitemia/GUI/PiaZ.fs b/Parasitemia/Parasitemia/GUI/PiaZ.fs index a373e53..d551b8d 100644 --- a/Parasitemia/Parasitemia/GUI/PiaZ.fs +++ b/Parasitemia/Parasitemia/GUI/PiaZ.fs @@ -1,50 +1,42 @@ // ParasitemIA Zipped file format. module Parasitemia.GUI.PiaZ +open System open System.Windows open System.IO open System.IO.Compression -open FSharp.Data - open Emgu.CV open Emgu.CV.Structure +open Newtonsoft.Json +open Newtonsoft.Json.Converters + open Types let extension = ".piaz" let filter = "PIA|*.piaz" +// Information associated to a document. +type JSONInformation = { + patientID: string +} + +// Information associated to each images. +type JSONSourceImage = { + num: int + RBCRadius: float32 // The RBC Radius found by granulometry. + parameters: Config.Parameters + dateLastAnalysis: DateTime + rbcs: RBC List +} + type FileData = { - sources: SourceImage list - patientID: string } - -// The json type associated to a source image. -type JSONSourceImage = JsonProvider<""" - { - "rbcs": [ - { - "num": 1, - "infected": true, - "setManually": false, - "posX" : 42.5, - "posY" : 42.5, - "width" : 10.5, - "height" : 10.5, - "stainArea" : 10 - } - ] - } -"""> - -// The json type associated to a file. -type JSONMainInformation = JsonProvider<""" - { - "patientID": "1234abcd" - } -"""> - -let mainFilename = "info.json" + patientID: string + images: SourceImage list +} + +let mainEntryName = "info.json" let imageExtension = ".tiff" let save (filePath: string) (data: FileData) = @@ -54,49 +46,42 @@ let save (filePath: string) (data: FileData) = e.Delete() // Main JSON file. - let mainJSON = JSONMainInformation.Root(data.patientID) - let mainFile = file.CreateEntry(mainFilename, CompressionLevel.Fastest) - use mainFileWriter = new StreamWriter(mainFile.Open()) - mainJSON.JsonValue.WriteTo(mainFileWriter, JsonSaveOptions.None) + let mainEntry = file.CreateEntry(mainEntryName, CompressionLevel.Fastest) + use mainEntryWriter = new StreamWriter(mainEntry.Open()) + mainEntryWriter.Write(JsonConvert.SerializeObject({ JSONInformation.patientID = data.patientID })) // Write each images and the associated information. - for imgSrc in data.sources do - let imgFilename = (string imgSrc.num) + imageExtension + for srcImg in data.images do + let imgFilename = (string srcImg.num) + imageExtension let imgEntry = file.CreateEntry(imgFilename, CompressionLevel.NoCompression) // FIXME: It seems a compression is applied to this file despite of the 'NoCompression' flag. - imgSrc.img.ToBitmap().Save(imgEntry.Open(), System.Drawing.Imaging.ImageFormat.Tiff) - - let imgJSON = - JSONSourceImage.Root([| for rbc in imgSrc.rbcs -> - JSONSourceImage.Rbc( - rbc.num, - rbc.infected, rbc.setManually, - decimal rbc.center.X, decimal rbc.center.Y, decimal rbc.size.Width, decimal rbc.size.Height, - rbc.infectedArea) |]) + srcImg.img.ToBitmap().Save(imgEntry.Open(), System.Drawing.Imaging.ImageFormat.Tiff) let imgJSONEntry = file.CreateEntry(imgFilename + ".json", CompressionLevel.Fastest) use imgJSONFileWriter = new StreamWriter(imgJSONEntry.Open()) - imgJSON.JsonValue.WriteTo(imgJSONFileWriter, JsonSaveOptions.None) + imgJSONFileWriter.Write(JsonConvert.SerializeObject({ num = srcImg.num; RBCRadius = srcImg.config.RBCRadius.Pixel; parameters = srcImg.config.Parameters; dateLastAnalysis = srcImg.dateLastAnalysis; rbcs = srcImg.rbcs })) let load (filePath: string) : FileData = use file = ZipFile.Open(filePath, ZipArchiveMode.Read) - let mainFile = file.GetEntry(mainFilename) - let mainJSON = JSONMainInformation.Load(mainFile.Open()) - - let sources = [ - let mutable imgNum = 0 - for imgEntry in file.Entries do - let filename = imgEntry.Name - if filename.EndsWith(imageExtension) - then - let img = new Image(new System.Drawing.Bitmap(imgEntry.Open(), false)) // FIXME: Should we dispose the bitmap? - imgNum <- imgNum + 1 - let imgJSONEntry = file.GetEntry(filename + ".json") - let imgJSON = JSONSourceImage.Load(imgJSONEntry.Open()) - yield { num = imgNum; img = img; rbcs = [ for rbc in imgJSON.Rbcs -> - { num = rbc.Num; - infected = rbc.Infected; setManually = rbc.SetManually; - center = Point(float rbc.PosX, float rbc.PosY); size = Size(float rbc.Width, float rbc.Height); - infectedArea = rbc.StainArea } ] } ] - { sources = sources; patientID = mainJSON.PatientId } \ No newline at end of file + let mainEntry = file.GetEntry(mainEntryName) + use mainEntryReader = new StreamReader(mainEntry.Open()) + let info = JsonConvert.DeserializeObject(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(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(imgEntryFileReader.ReadToEnd()) + let config = 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