B
This commit is contained in:
parent
e5e8880e41
commit
518da4a923
1019 changed files with 15877 additions and 0 deletions
1
Task/Bitmap-Read-an-image-through-a-pipe/0DESCRIPTION
Normal file
1
Task/Bitmap-Read-an-image-through-a-pipe/0DESCRIPTION
Normal file
|
|
@ -0,0 +1 @@
|
|||
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.
|
||||
4
Task/Bitmap-Read-an-image-through-a-pipe/1META.yaml
Normal file
4
Task/Bitmap-Read-an-image-through-a-pipe/1META.yaml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
category:
|
||||
- Input Output
|
||||
note: Raster graphics operations
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
ppm := Run("cmd.exe /c convert lena50.jpg ppm:-")
|
||||
; pipe in from imagemagick
|
||||
img := ppm_read("", ppm) ;
|
||||
x := img[4,4] ; get pixel(4,4)
|
||||
y := img[24,24] ; get pixel(24,24)
|
||||
msgbox % x.rgb() " " y.rgb()
|
||||
img.write("lena50copy.ppm")
|
||||
return
|
||||
|
||||
ppm_read(filename, ppmo=0) ; only ppm6 files supported
|
||||
{
|
||||
if !ppmo ; if image not already in memory, read from filename
|
||||
fileread, ppmo, % filename
|
||||
|
||||
index := 1
|
||||
pos := 1
|
||||
|
||||
loop, parse, ppmo, `n, `r
|
||||
{
|
||||
if (substr(A_LoopField, 1, 1) == "#")
|
||||
continue
|
||||
loop,
|
||||
{
|
||||
if !pos := regexmatch(ppmo, "\d+", pixel, pos)
|
||||
break
|
||||
bitmap%A_Index% := pixel
|
||||
if (index == 4)
|
||||
Break
|
||||
pos := regexmatch(ppmo, "\s", x, pos)
|
||||
index ++
|
||||
}
|
||||
}
|
||||
|
||||
type := bitmap1
|
||||
width := bitmap2
|
||||
height := bitmap3
|
||||
maxcolor := bitmap4
|
||||
bitmap := Bitmap(width, height, color(0,0,0))
|
||||
index := 1
|
||||
i := 1
|
||||
j := 1
|
||||
bits := pos
|
||||
loop % width * height
|
||||
{
|
||||
bitmap[i, j, "r"] := numget(ppmo, 3 * A_Index + bits, "uchar")
|
||||
bitmap[i, j, "g"] := numget(ppmo, 3 * A_Index + bits + 1, "uchar")
|
||||
bitmap[i, j, "b"] := numget(ppmo, 3 * A_Index + bits + 2, "uchar")
|
||||
|
||||
if (j == width)
|
||||
{
|
||||
j := 1
|
||||
i += 1
|
||||
}
|
||||
else
|
||||
j++
|
||||
}
|
||||
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
|
||||
|
|
@ -0,0 +1 @@
|
|||
image read_image(const char *name);
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
#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;
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package main
|
||||
|
||||
// Files required to build supporting package raster are found in:
|
||||
// * Bitmap
|
||||
// * Read a PPM file
|
||||
// * Write a PPM file
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"raster"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// (A file with this name is output by the Go solution to the task
|
||||
// "Bitmap/PPM conversion through a pipe," but of course any handy
|
||||
// jpeg should work.)
|
||||
c := exec.Command("djpeg", "pipeout.jpg")
|
||||
pipe, err := c.StdoutPipe()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
err = c.Start()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
b, err := raster.ReadPpmFrom(pipe)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
err = b.WritePpmFile("pipein.ppm")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
(setq *Ppm (ppmRead '("convert" "img.jpg" "ppm:-")))
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
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')
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
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
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue