[07d29c]: imwrite.m Maximize Restore History

Download this file

imwrite.m    271 lines (256 with data), 10.3 kB

  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
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
## Copyright (C) 2002 Andy Adler
##
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## any later version. USE THIS SOFTWARE AT YOUR OWN RISK.
#IMWRITE: write image from octave to various file formats
#
# Note: this requires the ImageMagick "convert" utility.
# get this from www.imagemagick.org if required
# additional documentation of options is available from the
# convert man page
#
# BASIC USAGE:
# imwrite( fname, img )
# - img is a greyscale (0-255) of image in fname
# imwrite( fname, img, map )
# - map is a matrix of [r,g,b], 0-1 triples
# - img is a matrix on indeces into map
# imwrite( fname, r,g,b );
# - r,g,b are red,green,blue (0-255) compondents
#
# Formats for image fname
# 1. simple guess from extention ie "fig.jpg", "blah.gif"
# 2. specify explicitly "jpg:fig.jpg", "gif:blah.gif"
# 3. specify subimage for multi-image format "tiff:file.tif[3]"
# 4. raw images (row major format) specify geometry
# "raw:img[256x180]"
#
# IMREAD OPTIONS:
# imread will support most of the options for convert.1
#
# imwrite( fname, img, options )
# imwrite( fname, img, map, options )
# imwrite( fname, r,g,b, options );
#
# where options is a string matrix (or list) of options
#
# example: options= ["-rotate 25";
# "-crop 200x200+150+150";
# "-sample 200%" ];
# will rotate, crop, and then expand the image.
# note that the order of operations is important
#
# The following options are supported
# -antialias remove pixel-aliasing
# -background color background color
# -blur geometry blur the image
# -border geometry surround image with a border of color
# -bordercolor color border color
# -box color color for annotation bounding box
# -charcoal radius simulate a charcoal drawing
# -colorize value colorize the image with the fill color
# -colors value preferred number of colors in the image
# -colorspace type alternate image colorspace
# -comment string annotate image with comment
# -compress type type of image compression
# -contrast enhance or reduce the image contrast
# -crop geometry preferred size and location of the cropped image
# -density geometry vertical and horizontal density of the image
# -depth value depth of the image
# -despeckle reduce the speckles within an image
# -dispose method GIF disposal method
# -dither apply Floyd/Steinberg error diffusion to image
# -draw string annotate the image with a graphic primitive
# -edge radius apply a filter to detect edges in the image
# -emboss radius emboss an image
# -enhance apply a digital filter to enhance a noisy image
# -equalize perform histogram equalization to an image
# -fill color color to use when filling a graphic primitive
# -filter type use this filter when resizing an image
# -flip flip image in the vertical direction
# -flop flop image in the horizontal direction
# -font name font for rendering text
# -frame geometry surround image with an ornamental border
# -fuzz distance colors within this distance are considered equal
# -gamma value level of gamma correction
# -geometry geometry perferred size or location of the image
# -gaussian geometry gaussian blur an image
# -gravity type vertical and horizontal text placement
# -implode amount implode image pixels about the center
# -intent type Absolute, Perceptual, Relative, or Saturation
# -interlace type None, Line, Plane, or Partition
# -label name assign a label to an image
# -level value adjust the level of image contrast
# -list type Color, Delegate, Format, Magic, Module, or Type
# -map filename transform image colors to match this set of colors
# -matte store matte channel if the image has one
# -median radius apply a median filter to the image
# -modulate value vary the brightness, saturation, and hue
# -monochrome transform image to black and white
# -morph value morph an image sequence
# -negate replace every pixel with its complementary color
# -noise radius add or reduce noise in an image
# -normalize transform image to span the full range of colors
# -opaque color change this color to the fill color
# -page geometry size and location of an image canvas
# -paint radius simulate an oil painting
# -profile filename add ICM or IPTC information profile to image
# -quality value JPEG/MIFF/PNG compression level
# -raise value lighten/darken image edges to create a 3-D effect
# -region geometry apply options to a portion of the image
# -roll geometry roll an image vertically or horizontally
# -rotate degrees apply Paeth rotation to the image
# -sample geometry scale image with pixel sampling
# -scale geometry resize image
# -segment values segment an image
# -seed value pseudo-random number generator seed value
# -shade degrees shade the image using a distant light source
# -sharpen geometry sharpen the image
# -shave geometry shave pixels from the image edges
# -shear geometry slide one edge of the image along the X or Y axis
# -size geometry width and height of image
# -solarize threshold negate all pixels above the threshold level
# -spread amount displace image pixels by a random amount
# -stroke color color to use when stoking a graphic primitive
# -strokewidth value width of stroke
# -swirl degrees swirl image pixels about the center
# -texture filename name of texture to tile onto the image background
# -threshold value threshold the image
# -tile filename tile image when filling a graphic primitive
# -transparent color make this color transparent within the image
# -treedepth value depth of the color tree
# -type type image type
# -units type PixelsPerInch, PixelsPerCentimeter, or Undefined
# -unsharp geometry sharpen the image
function imwrite(fname, p2, p3 ,p4 ,p5 );
try save_empty_list_elements_ok= empty_list_elements_ok;
catch save_empty_list_elements_ok= 0;
end
try save_warn_empty_list_elements= warn_empty_list_elements;
catch save_warn_empty_list_elements= 0;
end
unwind_protect
empty_list_elements_ok= 1;
warn_empty_list_elements= 0;
# some older versions of octave didn't seem handle piped output correctly
usepipe=1;
if ( nargin <= 1 ) || ...
( ! ischar (fname)) || ...
( nargin == 2 && ischar(p2) )
usage([ ...
"imwrite( fname, img )\n", ...
"imwrite( fname, img, map )\n", ...
"imwrite( fname, r,g,b );\n", ...
"imwrite( fname, img, options )\n", ...
"imwrite( fname, img, map, options )\n", ...
"imwrite( fname, r,g,b, options );\n"]);
endif
# Put together the options string
# TODO: add some error checking to options
option_str="";
n_mat= nargin-1;
options= eval(sprintf("p%d",nargin));
# process options strings if given
if ischar(options)
n_mat--;
for i= 1:size(options,1)
option_str=[option_str," ", options(i,:) ];
end
elseif is_list( options )
n_mat--;
for i= 1:length(options)
option_str=[option_str," ", nth(options,i) ];
end
end
[hig,wid] = size(p2);
if n_mat==1
data= p2';
outputtype="pgm";
pnm_sig="P5";
elseif n_mat==2
img= p2';
data= [ 255*reshape(p3(img,1),1, hig*wid);
255*reshape(p3(img,2),1, hig*wid);
255*reshape(p3(img,3),1, hig*wid) ];
outputtype="ppm";
pnm_sig="P6";
elseif n_mat==3
data= [ reshape(p2',1, hig*wid);
reshape(p3',1, hig*wid);
reshape(p4',1, hig*wid) ];
outputtype="ppm";
pnm_sig="P6";
else
error("imwrite: too many data matrices specified");
end
if usepipe
pname= sprintf("convert %s %s:- '%s' 2>/dev/null",
option_str, outputtype, fname);
fid= popen(pname ,'w');
if fid<0;
error('could not create image data. Is ImageMagick installed?');
end
else
tnam= tmpnam();
cmd= sprintf("convert %s '%s:%s' '%s' 2>/dev/null",
option_str, outputtype, tnam, fname);
fid= fopen(tnam, "wb");
end
fprintf(fid,"%s\n%d %d\n255\n",pnm_sig,wid,hig);
write_count= fwrite(fid,data(:));
if write_count != prod(size(data))
fclose(fid);
if ~usepipe
unlink(tnam);
end
error(['Problem writing image: ', fname ]);
end
fclose(fid);
if ~usepipe
[jnk,retcode] = system(cmd);
if retcode !=0
error('could not call imagemagick convert');
end
unlink( tnam );
end
unwind_protect_cleanup
empty_list_elements_ok= save_empty_list_elements_ok;
warn_empty_list_elements= save_warn_empty_list_elements;
end_unwind_protect
#
# $Log$
# Revision 1.10 2005/09/08 02:00:17 pkienzle
# [for Bill Denney] isstr -> ischar
#
# Revision 1.9 2005/07/21 16:03:02 aadler
# Improve error messages and use pipes
#
# Revision 1.8 2005/05/25 03:43:40 pkienzle
# Author/Copyright consistency
#
# Revision 1.7 2005/04/25 01:05:28 aadler
# added GPL copyrights
#
# Revision 1.6 2003/09/12 14:22:42 adb014
# Changes to allow use with latest CVS of octave (do_fortran_indexing, etc)
#
# Revision 1.5 2003/07/25 19:11:41 pkienzle
# Make sure all files names referenced in system calls are wrapped in quotes
# to protect against spaces in the path.
#
# Revision 1.4 2002/11/27 08:40:11 pkienzle
# author/license updates
#
# Revision 1.3 2002/03/19 18:14:13 aadler
# unfortunately using popen seems to create problems, mostly
# on win32, but also on linux, so we need to move to a tmpfile approach
#
# Revision 1.2 2002/03/17 05:26:14 aadler
# now accept filenames with spaces
#
# Revision 1.1 2002/03/11 01:56:47 aadler
# general image read/write functionality using imagemagick utilities
#
#