Bitmap/Read an image through a pipe: Difference between revisions
(added autohotkey implementation) |
|||
Line 4: | Line 4: | ||
This task is the ''opposite'' of the [[PPM conversion through a pipe]]. In this task, using a delegate tool (like '''cjpeg''', one of the netpbm package, or '''convert''' of the ImageMagick package) we read an image file and load it into the data storage type [[Basic bitmap storage|defined here]]. We can also use the code from [[Read ppm file]], so that we can use PPM format like a (natural) bridge between the foreign image format and our simple data storage. |
This task is the ''opposite'' of the [[PPM conversion through a pipe]]. In this task, using a delegate tool (like '''cjpeg''', one of the netpbm package, or '''convert''' of the ImageMagick package) we read an image file and load it into the data storage type [[Basic bitmap storage|defined here]]. We can also use the code from [[Read ppm file]], so that we can use PPM format like a (natural) bridge between the foreign image format and our simple data storage. |
||
=={{header|AutoHotkey}}== |
|||
{{works with | AutoHotkey_L}} |
|||
Uses [http://www.autohotkey.com/forum/viewtopic.php?t=16823 StdoutTovar.ahk] |
|||
<lang AutoHotkey>ppm := Run("cmd.exe /c convert lena50.jpg -compress none ppm:-") |
|||
; pipe in from imagemagick |
|||
img := ppm_read("", ppm) ; |
|||
x := img[4,4] ; get pixel(4,4) |
|||
msgbox % "img: 4,4,R,G,B, RGB: " x.R ", " x.G ", " x.B ", " x.rgb() |
|||
img.write("lena50.ppm") |
|||
return |
|||
ppm_read(filename, ppmo=0) ; only ppm3 files supported (ascii) |
|||
{ |
|||
if !ppmo ; if image not already in memory, read from filename |
|||
fileread, ppmo, % filename, utf-8 |
|||
loop, parse, ppmo, `n, `r |
|||
{ |
|||
if (substr(A_LoopField, 1, 1) == "#") |
|||
continue |
|||
ppm_nocomment .= A_LoopField "`n" |
|||
} |
|||
index := 1 |
|||
pos := 1 |
|||
while pos := regexmatch(ppm_nocomment, "\d+", pixel, pos) |
|||
{ |
|||
pos := regexmatch(ppm_nocomment, "\s", x, pos) |
|||
bitmap%A_Index% := pixel |
|||
if (index == 4) |
|||
Break |
|||
index ++ |
|||
} |
|||
type := bitmap1 |
|||
width := bitmap2 |
|||
height := bitmap3 |
|||
maxcolor := bitmap4 |
|||
bitmap := Bitmap(width, height, color(0,0,0)) |
|||
index := 1 |
|||
width := 1 |
|||
height := 1 |
|||
while pos := regexmatch(ppm_nocomment, "\d+", pixel, pos) |
|||
{ |
|||
pix%index% := pixel |
|||
index++ |
|||
if (index > 3) |
|||
{ |
|||
index := 1 |
|||
pixel := Color(pix1, pix2, pix3) |
|||
bitmap[height, width] := pixel |
|||
if (width == bitmap.width) |
|||
{ |
|||
width := 1 |
|||
height += 1 |
|||
} |
|||
else |
|||
width++ |
|||
} |
|||
pos := regexmatch(ppm_nocomment, "\s", x, pos) |
|||
} |
|||
return bitmap |
|||
} |
|||
#include bitmap_storage.ahk ; from http://rosettacode.org/wiki/Basic_bitmap_storage/AutoHotkey |
|||
#include run.ahk ; http://www.autohotkey.com/forum/viewtopic.php?t=16823 |
|||
</lang> |
|||
=={{header|C}}== |
=={{header|C}}== |
Revision as of 23:16, 7 June 2010
You are encouraged to solve this task according to the task description, using any language you may know.
This task is the opposite of the PPM conversion through a pipe. In this task, using a delegate tool (like cjpeg, one of the netpbm package, or convert of the ImageMagick package) we read an image file and load it into the data storage type defined here. We can also use the code from Read ppm file, so that we can use PPM format like a (natural) bridge between the foreign image format and our simple data storage.
AutoHotkey
Uses StdoutTovar.ahk <lang AutoHotkey>ppm := Run("cmd.exe /c convert lena50.jpg -compress none ppm:-")
; pipe in from imagemagick
img := ppm_read("", ppm) ; x := img[4,4] ; get pixel(4,4) msgbox % "img: 4,4,R,G,B, RGB: " x.R ", " x.G ", " x.B ", " x.rgb() img.write("lena50.ppm") return
ppm_read(filename, ppmo=0) ; only ppm3 files supported (ascii) { if !ppmo ; if image not already in memory, read from filename
fileread, ppmo, % filename, utf-8 loop, parse, ppmo, `n, `r { if (substr(A_LoopField, 1, 1) == "#") continue ppm_nocomment .= A_LoopField "`n" } index := 1 pos := 1 while pos := regexmatch(ppm_nocomment, "\d+", pixel, pos) { pos := regexmatch(ppm_nocomment, "\s", x, pos) bitmap%A_Index% := pixel if (index == 4) Break index ++ } type := bitmap1 width := bitmap2 height := bitmap3 maxcolor := bitmap4 bitmap := Bitmap(width, height, color(0,0,0)) index := 1 width := 1 height := 1 while pos := regexmatch(ppm_nocomment, "\d+", pixel, pos) { pix%index% := pixel index++ if (index > 3)
{
index := 1 pixel := Color(pix1, pix2, pix3) bitmap[height, width] := pixel if (width == bitmap.width)
{ width := 1 height += 1 }
else
width++ }
pos := regexmatch(ppm_nocomment, "\s", x, pos) }
return bitmap
}
- include bitmap_storage.ahk ; from http://rosettacode.org/wiki/Basic_bitmap_storage/AutoHotkey
- include run.ahk ; http://www.autohotkey.com/forum/viewtopic.php?t=16823
</lang>
C
Here I've used convert by ImageMagick. It is up to the program to understand the source file type; in this way, we can read theoretically any image format ImageMagick can handle. The get_ppm function defined in Read ppm file is used.
<lang c>image read_image(const char *name);</lang>
<lang c>#include "imglib.h"
- define MAXCMDBUF 100
- define MAXFILENAMELEN 256
- define MAXFULLCMDBUF (MAXCMDBUF + MAXFILENAMELEN)
image read_image(const char *name) {
FILE *pipe; char buf[MAXFULLCMDBUF]; image im; FILE *test = fopen(name, "r"); if ( test == NULL ) { fprintf(stderr, "cannot open file %s\n", name); return NULL; } fclose(test); snprintf(buf, MAXFULLCMDBUF, "convert \"%s\" ppm:-", name); pipe = popen(buf, "r"); if ( pipe != NULL ) { im = get_ppm(pipe); pclose(pipe); return im; } return NULL;
}</lang>
OCaml
The read_ppm
function of the page read ppm file and used by the code below would need to be changed to take as parameter an input channel instead of the filename.
<lang ocaml>let read_image ~filename =
if not(Sys.file_exists filename) then failwith(Printf.sprintf "the file %s does not exist" filename); let cmd = Printf.sprintf "convert \"%s\" ppm:-" filename in let ic, oc = Unix.open_process cmd in let img = read_ppm ~ic in (img)
- </lang>
Ruby
Extending Read ppm file#Ruby and PPM conversion through a pipe#Ruby. Uses the ImageMagick convert
tool.
<lang ruby>class Pixmap
def self.read_ppm(ios) format = ios.gets.chomp width, height = ios.gets.chomp.split.map {|n| n.to_i } max_colour = ios.gets.chomp
if (not PIXMAP_FORMATS.include?(format)) or width < 1 or height < 1 or max_colour != '255' then ios.close raise StandardError, "file '#{filename}' does not start with the expected header" end ios.binmode if PIXMAP_BINARY_FORMATS.include?(format)
bitmap = self.new(width, height) height.times do |y| width.times do |x| # read 3 bytes red, green, blue = case format when 'P3' then ios.gets.chomp.split when 'P6' then ios.read(3).unpack('C3') end bitmap[x,y] = RGBColour.new(red, green, blue) end end ios.close bitmap end
def self.open(filename) read_ppm(File.open(filename, 'r')) end
def self.open_from_jpeg(filename) read_ppm(IO.popen("convert jpg:#{filename} ppm:-", 'r')) end
end
bitmap = Pixmap.open_from_jpeg('file.jpg')</lang>
Tcl
<lang tcl>package require Tk
proc magickalReadImage {bufferImage fileName} {
set f [open |[list convert [file normalize $fileName] ppm:-] "rb"] try { $bufferImage put [read $f] -format ppm } finally { close $f }
}</lang>