Bitmap/Read a PPM file: Difference between revisions
m (Category:Input Output) |
(→{{header|Ada}}: Blocked input to improve performance) |
||
Line 14: | Line 14: | ||
function Get_PPM (File : File_Type) return Image is |
function Get_PPM (File : File_Type) return Image is |
||
use Ada.Characters.Latin_1; |
|||
⚫ | |||
use Ada.Integer_Text_IO; |
|||
function Get_Line return String is -- Skips comments |
function Get_Line return String is -- Skips comments |
||
⚫ | |||
Buffer : String (1..80); |
Buffer : String (1..80); |
||
begin |
begin |
||
Line 59: | Line 61: | ||
declare |
declare |
||
Result : Image (1..Height, 1..Width); |
Result : Image (1..Height, 1..Width); |
||
Buffer : String (1..Width * 3); |
|||
Index : Positive; |
|||
begin |
begin |
||
for I in Result'Range (1) loop |
for I in Result'Range (1) loop |
||
String'Read (Stream (File), Buffer); |
|||
Index := Buffer'First; |
|||
for J in Result'Range (2) loop |
for J in Result'Range (2) loop |
||
Result (I, J) := |
|||
( R => Luminance (Character'Pos (Buffer (Index))), |
|||
Character' |
G => Luminance (Character'Pos (Buffer (Index + 1))), |
||
B => Luminance (Character'Pos (Buffer (Index + 2))) |
|||
); |
|||
Index := Index + 3; |
|||
end loop; |
end loop; |
||
end loop; |
end loop; |
Revision as of 18:57, 7 December 2008
You are encouraged to solve this task according to the task description, using any language you may know.
Using the data storage type defined on this page for raster images, read an image from a PPM file (binary P6 prefered). (Read the definition of PPM file on Wikipedia.)
Task: Use write ppm file solution and grayscale image solution with this one in order to convert a color image to grayscale one.
Ada
<ada> with Ada.Characters.Latin_1; use Ada.Characters.Latin_1; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
function Get_PPM (File : File_Type) return Image is
use Ada.Characters.Latin_1; use Ada.Integer_Text_IO;
function Get_Line return String is -- Skips comments Byte : Character; Buffer : String (1..80); begin loop for I in Buffer'Range loop Character'Read (Stream (File), Byte); if Byte = LF then exit when Buffer (1) = '#'; return Buffer (1..I - 1); end if; Buffer (I) := Byte; end loop; if Buffer (1) /= '#' then raise Data_Error; end if; end loop; end Get_Line;
Height : Integer; Width : Integer;
begin
if Get_Line /= "P6" then raise Data_Error; end if; declare Line : String := Get_Line; Start : Integer := Line'First; Last : Positive; begin Get (Line, Width, Last); Start := Start + Last; Get (Line (Start..Line'Last), Height, Last); Start := Start + Last; if Start <= Line'Last then raise Data_Error; end if; if Width < 1 or else Height < 1 then raise Data_Error; end if; end; if Get_Line /= "255" then raise Data_Error; end if; declare Result : Image (1..Height, 1..Width); Buffer : String (1..Width * 3); Index : Positive; begin for I in Result'Range (1) loop String'Read (Stream (File), Buffer); Index := Buffer'First; for J in Result'Range (2) loop Result (I, J) := ( R => Luminance (Character'Pos (Buffer (Index))), G => Luminance (Character'Pos (Buffer (Index + 1))), B => Luminance (Character'Pos (Buffer (Index + 2))) ); Index := Index + 3; end loop; end loop; return Result; end;
end Get_PPM; </ada> The implementation propagates Data_Error when the file format is incorrect. End_Error is propagated when the file end is prematurely met. The following example illustrates conversion of a color file to grayscale. <ada> declare
F1, F2 : File_Type;
begin
Open (F1, In_File, "city.ppm"); Create (F2, Out_File, "city_grayscale.ppm"); Put_PPM (F2, Color (Grayscale (Get_PPM (F1)))); Close (F1); Close (F2);
end; </ada>