-
Notifications
You must be signed in to change notification settings - Fork 0
/
imageWriter.pl
61 lines (54 loc) · 2.16 KB
/
imageWriter.pl
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
59
60
% #####################################
% # writing of PPM images from prolog #
% #####################################
% writes a given ImageId into the output folder
writeOutput(ImageId):-
!,string_concat('./img/output/',ImageId,FilePath),
!,writeImage(FilePath,ImageId).
% writes a given ImageId into the preview folder
writePreview(ImageId):-
!,string_concat('./img/preview/',ImageId,FilePath),
!,writeImage(FilePath,ImageId).
% writes the given image to a given path
writeImage(Path,ImageId):-
setup_call_cleanup(
(
debug(imageWriter,'Opening File'),
open(Path, write, FileStream,[buffer(full),close_on_abort(true)])
),
(!,debug(imageWriter,'Start writing image'),writeImageStream(FileStream,ImageId),!),
(debug(imageWriter,'Closing File'),close(FileStream))
).
% writes the image into the open filestream
writeImageStream(FileStream,ImageId) :-
!,debug(imageWriter,'Write Header'),
!,imageMeta(ImageId, Width,Height,Depth,_,TotalPixelCount),
!,write(FileStream,'P3\n'),
!,debug(imageWriter,'Write Comment Field'),
!,write(FileStream,'# Written by Prolog\n'),
!,debug(imageWriter,'Write Image Spec'),
!,write(FileStream,Width),
!,write(FileStream,' '),
!,write(FileStream,Height),
!,write(FileStream,'\n'),
!,write(FileStream,Depth),
!,write(FileStream,'\n'),
!,debug(imageWriter,'Writing Pixel Data'),
!, iterativeWrite(FileStream,ImageId,Width,0,TotalPixelCount).
% recursive writing until all images are written
iterativeWrite(_,_,_ ,TotalPixelCount,TotalPixelCount).
iterativeWrite(FileStream,ImageId,Width,Counter,TotalPixelCount):-
!,CurX is mod(Counter,Width),
!,CurY is floor(Counter / Width),
!,NewCounter is Counter + 1,
!,imagePixel(ImageId, CurX,CurY,R,G,B),
!,writeRGBTuple(FileStream,(R,G,B)),
!,iterativeWrite(FileStream,ImageId,Width,NewCounter,TotalPixelCount).
% writes a single rgb image to filestream
writeRGBTuple(FileStream,(R,G,B)):-
write(FileStream,R),
write(FileStream," "),
write(FileStream,G),
write(FileStream," "),
write(FileStream,B),
write(FileStream," \n").