summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--html/download/im_view.zipbin2083 -> 2617 bytes
-rw-r--r--html/download/samples_imlua5.tar.gzbin30150 -> 32944 bytes
-rw-r--r--html/download/samples_imlua5.zipbin34315 -> 37436 bytes
-rw-r--r--html/en/capture_samples.html3
-rw-r--r--html/en/history.html2
-rw-r--r--html/en/proc_samples.html3
-rw-r--r--html/en/rep_samples.html6
-rw-r--r--html/en/samples.html16
-rw-r--r--html/en/storage_samples.html6
-rw-r--r--html/examples/analyze.lua28
-rw-r--r--html/examples/capture.lua63
-rw-r--r--html/examples/combine9.lua107
-rw-r--r--html/examples/error.lua10
-rw-r--r--html/examples/fft.lua17
-rw-r--r--html/examples/flower.jpgbin0 -> 17915 bytes
-rw-r--r--html/examples/glut_capture.c (renamed from html/download/glut_capture.c)7
-rw-r--r--html/examples/im_copy.cpp (renamed from html/download/im_copy.cpp)33
-rw-r--r--html/examples/im_info.cpp (renamed from html/download/im_info.cpp)12
-rw-r--r--html/examples/im_view.c (renamed from html/download/im_view.c)39
-rw-r--r--html/examples/index.lua18
-rw-r--r--html/examples/info.lua149
-rw-r--r--html/examples/iupglview.c237
-rw-r--r--html/examples/lena.jpgbin0 -> 7145 bytes
-rw-r--r--html/examples/multimorpho.lua103
-rw-r--r--html/examples/palette.lua6
-rw-r--r--html/examples/proc_fourier.cpp (renamed from html/download/proc_fourier.cpp)0
-rw-r--r--html/examples/process.lua50
-rw-r--r--html/examples/process_new.lua44
-rw-r--r--html/examples/render.lua50
-rw-r--r--html/examples/render_cd.lua19
-rw-r--r--html/examples/screencapture.lua13
-rw-r--r--html/examples/show_flower.wlua31
-rw-r--r--html/examples/view.wlua183
-rw-r--r--include/im_lib.h2
34 files changed, 1211 insertions, 46 deletions
diff --git a/html/download/im_view.zip b/html/download/im_view.zip
index 5491add..e02233e 100644
--- a/html/download/im_view.zip
+++ b/html/download/im_view.zip
Binary files differ
diff --git a/html/download/samples_imlua5.tar.gz b/html/download/samples_imlua5.tar.gz
index 33a199b..849e964 100644
--- a/html/download/samples_imlua5.tar.gz
+++ b/html/download/samples_imlua5.tar.gz
Binary files differ
diff --git a/html/download/samples_imlua5.zip b/html/download/samples_imlua5.zip
index 5163b90..f47c067 100644
--- a/html/download/samples_imlua5.zip
+++ b/html/download/samples_imlua5.zip
Binary files differ
diff --git a/html/en/capture_samples.html b/html/en/capture_samples.html
index dcf795e..37bfaf2 100644
--- a/html/en/capture_samples.html
+++ b/html/en/capture_samples.html
@@ -17,8 +17,7 @@
draw the image into that canvas. But the image is obtained from a capture
device. The image can be processed before display and a sequence of captured
images can be saved in an AVI file during capture.</p>
- <p>You can view the source code here: <a href="../download/glut_capture.c">
- glut_capture.c</a></p>
+ <p>You can view the source code here: <a href="../examples/glut_capture.c">glut_capture.c</a></p>
<h3><a name="iupglcap">Capture and IUP</a></h3>
diff --git a/html/en/history.html b/html/en/history.html
index 8aac48f..7833a20 100644
--- a/html/en/history.html
+++ b/html/en/history.html
@@ -11,7 +11,7 @@
<body>
<h1>History of Changes</h1>
-<h3 dir="ltr">Version 3.4.2 (24/Jun/2009)</h3>
+<h3 dir="ltr">Version 3.4.2 (26/Jun/2009)</h3>
<ul>
<li><span style="color: #FF0000">Fixed:</span> AVI format when reading 32
and 16 bpp frames.</li>
diff --git a/html/en/proc_samples.html b/html/en/proc_samples.html
index e51ff37..a15d39b 100644
--- a/html/en/proc_samples.html
+++ b/html/en/proc_samples.html
@@ -23,8 +23,7 @@
<p>Se also
<a href="doxygen/group__transform.html">
Reference / Image Processing / Domain Transform Operations</a>.</p>
- <p>You can view the source code here: <a href="../download/proc_fourier.cpp">
- proc_fourier.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/proc_fourier.cpp">proc_fourier.cpp</a></p>
<h3><a name="houghlines">Hough Lines</a></h3>
diff --git a/html/en/rep_samples.html b/html/en/rep_samples.html
index 5c729a8..118f781 100644
--- a/html/en/rep_samples.html
+++ b/html/en/rep_samples.html
@@ -46,8 +46,7 @@ samples.</p>
Model: CD MAVICA
Photometric: 2</pre>
- <p>You can view the source code here: <a href="../download/im_info.cpp">
- im_info.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/im_info.cpp">im_info.cpp</a></p>
<h3><a name="im_view">View Using IUP and CD</a></h3>
@@ -61,8 +60,7 @@ samples.</p>
http://www.tecgraf.puc-rio.br/iup</a> and more about CD see
<a target="_blank" href="http://www.tecgraf.puc-rio.br/cd">
http://www.tecgraf.puc-rio.br/cd</a>.</p>
- <p>You can view the source code here: <a href="../download/im_view.c">
- im_view.c</a>, or download it with some makefiles
+ <p>You can view the source code here: <a href="../examples/im_view.c">im_view.c</a>, or download it with some makefiles
<a href="../download/im_view.zip">im_view.zip</a>.</p>
diff --git a/html/en/samples.html b/html/en/samples.html
index e58835c..beba2cc 100644
--- a/html/en/samples.html
+++ b/html/en/samples.html
@@ -11,6 +11,7 @@
<body>
<h1>Complete Samples</h1>
+<p>&nbsp;You can also browse the <a href="../examples/">examples folder</a>. </p>
<h3><code>im_info</code></h3>
<p>This is a command line application that displays information obtained from a file using the IM I/O functions,
@@ -42,13 +43,13 @@
Model: CD MAVICA
Photometric: 2</pre>
- <p>You can view the source code here: <a href="../download/im_info.cpp">im_info.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/im_info.cpp">im_info.cpp</a></p>
<h3><code>im_copy</code></h3>
<p>This is a command line application that copies all the information from one file to another using the IM I/O
functions. It depends only on the IM main library. It is usefull for testing the drivers.</p>
- <p>You can view the source code here: <a href="../download/im_copy.cpp">im_copy.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/im_copy.cpp">im_copy.cpp</a></p>
<h3><code>proc_fourier</code></h3>
@@ -58,7 +59,7 @@
GPL. To use it in a commercial application you must contact the MIT and pay for a commercial license.</p>
<p>Se also <a href="doxygen/group__transform.html)">Reference / Image Processing / Domain
Transform Operations</a>.</p>
- <p>You can view the source code here: <a href="../download/proc_fourier.cpp">proc_fourier.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/proc_fourier.cpp">proc_fourier.cpp</a></p>
<h3><code>im_view</code></h3>
@@ -67,7 +68,7 @@
but using the <b>imImage</b> structure to make the implementation easier.</p>
<p>For more IUP <a target="_blank" href="http://www.tecgraf.puc-rio.br/iup">http://www.tecgraf.puc-rio.br/iup</a> and
more CD <a target="_blank" href="http://www.tecgraf.puc-rio.br/cd">http://www.tecgraf.puc-rio.br/cd</a></p>
- <p>You can view the source code here <a href="../download/im_view.c">im_view.c</a>, or download it with some makefiles
+ <p>You can view the source code here <a href="../examples/im_view.c">im_view.c</a>, or download it with some makefiles
<a href="../download/im_view.zip">im_view.zip</a>.</p>
<h3><code>glut_capture</code></h3>
@@ -75,7 +76,7 @@
<p>This application uses GLUT and OpenGL to create a window with a canvas and draw the image into that canvas. But the
image is obtained from a capture device. The image can be processed before display and a sequence of captured images
can be saved in an AVI file during capture.</p>
- <p>You can view the source code here: <a href="../download/glut_capture.c">glut_capture.c</a></p>
+ <p>You can view the source code here: <a href="../examples/glut_capture.c">glut_capture.c</a></p>
<h3><code>iupglcap</code></h3>
@@ -157,9 +158,10 @@ canvas:Kill()
image:Save(&quot;new.bmp&quot;, &quot;BMP&quot;) </pre>
- <p>Check the file <a href="../download/samples_imlua5.tar.gz">samples_imlua5.tar.gz</a>
+ <p>Check the files <a href="../download/samples_imlua5.tar.gz">samples_imlua5.tar.gz</a>
or <a href="../download/samples_imlua5.zip">samples_imlua5.zip</a> for several samples in Lua. For
- some of them you will need also the CD and the IUP libraries. </p>
+ some of them you will need also the CD and the IUP libraries. You can also
+ browse the <a href="../examples/">examples folder</a>. </p>
</body>
diff --git a/html/en/storage_samples.html b/html/en/storage_samples.html
index d4f5c41..16e2a88 100644
--- a/html/en/storage_samples.html
+++ b/html/en/storage_samples.html
@@ -45,16 +45,14 @@ samples.</p>
Model: CD MAVICA
Photometric: 2</pre>
- <p>You can view the source code here: <a href="../download/im_info.cpp">
- im_info.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/im_info.cpp">im_info.cpp</a></p>
<h3><a name="im_copy">Copy</a></h3>
<p>This is a command line application that copies all the information from one
file to another using the IM I/O functions. It depends only on the IM main
library. It is usefull for testing the drivers.</p>
- <p>You can view the source code here: <a href="../download/im_copy.cpp">
- im_copy.cpp</a></p>
+ <p>You can view the source code here: <a href="../examples/im_copy.cpp">im_copy.cpp</a></p>
<h3><a name="loadbmp">Load Bitmap from Resource File</a></h3>
diff --git a/html/examples/analyze.lua b/html/examples/analyze.lua
new file mode 100644
index 0000000..7f06496
--- /dev/null
+++ b/html/examples/analyze.lua
@@ -0,0 +1,28 @@
+require"imlua"
+require"imlua_process"
+
+local filename = "lena.jpg"
+
+local image = im.FileImageLoad(filename)
+local gray = im.ImageCreate(image:Width(), image:Height(), im.GRAY, image:DataType())
+local binary = im.ImageCreate(image:Width(), image:Height(), im.BINARY, image:DataType())
+local region = im.ImageCreate(image:Width(), image:Height(), im.GRAY, im.USHORT)
+
+-- make it grayscale
+im.ConvertColorSpace(image, gray)
+gray:Save("lena_gray.jpg", "JPEG")
+
+-- make it binary
+im.ProcessSliceThreshold(gray, binary, 0, 128)
+binary:Save("lena_binary.jpg", "JPEG")
+
+local count = im.AnalyzeFindRegions(binary, region, 4, 1)
+print("regions: ", count)
+
+local region2 = im.ImageCreate(image:Width(), image:Height(), im.GRAY, im.BYTE)
+im.ConvertDataType(region, region2, 0, 0, 0, 0)
+
+local region3 = im.ImageCreate(image:Width(), image:Height(), im.MAP, im.BYTE)
+im.ConvertColorSpace(region2, region3)
+region3:SetPalette(im.PaletteHighContrast(), 256)
+region3:Save("lena_region.gif", "GIF")
diff --git a/html/examples/capture.lua b/html/examples/capture.lua
new file mode 100644
index 0000000..491518a
--- /dev/null
+++ b/html/examples/capture.lua
@@ -0,0 +1,63 @@
+require"imlua"
+require"imlua_capture"
+
+im.VideoCaptureReloadDevices()
+
+print("--- Devices ---")
+local n = im.VideoCaptureDeviceCount()
+
+for i = 0, n - 1 do
+ desc = im.VideoCaptureDeviceDesc(i)
+ print(desc)
+end
+
+local vc = im.VideoCaptureCreate()
+print("connect: ", vc:Connect(0))
+print()
+
+print("--- Dialogs ---")
+
+local dc = vc:DialogCount()
+for i = 0, dc - 1 do
+ desc = vc:DialogDesc(i)
+ print(i, desc)
+ vc:ShowDialog(i)
+end
+print()
+
+
+print("--- Formats ---")
+
+local fc = vc:FormatCount()
+for i = 0, fc - 1 do
+ local success, width, height, desc = vc:GetFormat(i)
+ print(i, string.format("%dx%d", width, height), desc)
+end
+print()
+
+print("--- Image Size ---")
+local width, height = vc:GetImageSize()
+print(width, height)
+print()
+
+print("--- Attributes ---")
+attribs = vc:GetAttributeList()
+for i, name in ipairs(attribs) do
+ local error, percent = vc:GetAttribute(name)
+ if error == 0 then percent = "get error" end
+ print(i, name, percent)
+end
+--vc:SetAttribute("FlipVertical", 1)
+--vc:SetAttribute("FlipHorizontal", 1)
+print()
+
+print("--- Capture ---")
+local image = im.ImageCreate(width, height, im.RGB, im.BYTE)
+local res = vc:Live(1)
+if (res > 0) then
+ print("grabbing frame")
+ print(vc:Frame(image, 3000))
+end
+image:Save("capture.jpg", "JPEG")
+
+vc:Disconnect()
diff --git a/html/examples/combine9.lua b/html/examples/combine9.lua
new file mode 100644
index 0000000..0bc1b17
--- /dev/null
+++ b/html/examples/combine9.lua
@@ -0,0 +1,107 @@
+--A script to compose 9 photos, with 4/6 aspect ratio
+
+require"imlua"
+require"imlua_process"
+require"iuplua"
+
+function Confirm(title,msg)
+ if continue then
+ b=iup.Alarm(title, msg ,"Continue" ,"Exit")
+ if b==2 then continue=false print("Script Aborted!") end
+ end
+end
+
+function Create_Host_Image()
+ if continue then
+ local screenx=1024*3 screeny=684*3
+ dst_photo = im.ImageCreate(screenx, screeny, im.RGB, im.BYTE)
+ resize_photo = im.ImageCreate(1024, 684, im.RGB, im.BYTE) -- for resize
+ end
+end
+
+function Create_Host_Name(name)
+ if continue then
+ i=0
+ repeat
+ i=i+1
+ num=1000+i
+ numstr=string.sub(tostring(num),-3)
+-- path="D:/Composite/"
+ path="D:/Downloads/Test/"
+ ext=".jpg"
+ Result=path..name..numstr..ext
+ res,msg=io.open(Result)
+ io.close()
+ until not res
+ end
+end
+
+function Get_Source_Photo()
+ if continue then
+-- path="D:/MyPictures/"
+ path="D:/Downloads/Test/*.jpg"
+ Source, err = iup.GetFile(path)
+ print("Source: ", Source)
+ if err<0 then continue=false end
+ end
+end
+
+function Insert_Photo(num)
+ if continue then
+ title="Photo "..num.." of 9" msg=Source Confirm(title,msg)
+ wd=dst_photo:Width()
+ hd=dst_photo:Height()
+ --print("Dst Size:",wd,hd)
+ src_photo=im.FileImageLoadBitmap(Source)
+ valuex=src_photo:Width()
+ valuey=src_photo:Height()
+ --print("Source Size:",valuex,valuey)
+ panex={0,1024,2048,0,1024,2048,0,1024,2048}
+ paney={0,0,0,684,684,684,1368,1368,1368}
+ Xd=panex[num]
+ Yd=paney[num]
+ Wd=1024 Hd=684
+ -- extract a proportional rectangle from the source image
+ if 1.5*valuey>valuex then
+ Ws=valuex
+ Xs=0
+ Hs=math.floor(valuex/1.5)
+ Ys=math.floor((valuey-Hs)/2)
+ else
+ Hs=valuey
+ Ys=0
+ Ws=math.floor(1.5*Hs)
+ Xs=math.floor((valuex-Ws)/2)
+ end
+
+ --print("Crop Size:",Ws, Hs)
+ --print("Crop Shift:",Xs,Ys)
+ crop_photo = im.ImageCreate(Ws, Hs, im.RGB, im.BYTE)
+ im.ProcessCrop(src_photo, crop_photo, Xs,Ys)
+ im.ProcessResize(crop_photo, resize_photo, 1) -- do bilinear interpolation
+ im.ProcessInsert(dst_photo, resize_photo, dst_photo, Xd, Yd) -- insert resize in dst and place the result in dst
+ crop_photo:Destroy()
+
+ if num==9 then src_photo:CopyAttributes(dst_photo) end
+ end
+end
+
+function Save_Composite_Photo()
+ if continue then
+ name="Composite"
+ Create_Host_Name(name)
+ dst_photo:Save(Result, "JPEG")
+ os.execute(Result)
+ end
+end
+
+--Script Starts
+continue=true
+title="9 Panel Composite" msg="Photos can be anysize." Confirm(title,msg)
+Create_Host_Image()
+for i=1,9 do
+ num=i
+ Get_Source_Photo()
+ Insert_Photo(num)
+ end
+Save_Composite_Photo()
diff --git a/html/examples/error.lua b/html/examples/error.lua
new file mode 100644
index 0000000..f8c71a8
--- /dev/null
+++ b/html/examples/error.lua
@@ -0,0 +1,10 @@
+require"imlua"
+
+local filename = "lena.jpg"
+local image = im.FileImageLoad(filename)
+local image2 = im.ImageCreate(image:Width(), image:Height(), im.GRAY, im.USHORT)
+
+-- Both calls will signal an error because of incompatible parameters
+
+--im.ConvertDataType(image, image2, im.CPX_REAL, im.GAMMA_LINEAR, 0, im.CAST_MINMAX)
+im.ConvertColorSpace(image, image2, im.CPX_REAL, im.GAMMA_LINEAR, 0, im.CAST_MINMAX)
diff --git a/html/examples/fft.lua b/html/examples/fft.lua
new file mode 100644
index 0000000..3589635
--- /dev/null
+++ b/html/examples/fft.lua
@@ -0,0 +1,17 @@
+require"imlua"
+require"imlua_process"
+require"imlua_fftw"
+
+local filename = "lena.jpg"
+local image = im.FileImageLoad(filename)
+
+local complex = im.ImageCreate(image:Width(), image:Height(), image:ColorSpace(), im.CFLOAT)
+im.ProcessFFT(image, complex)
+
+local c = complex[0][5][10] -- component=0(Red), y = 5 x =10
+print(c[1], c[2])
+
+complex[0][5][10] = { 2*c[1], c[2]/2 }
+
+local c = complex[0][5][10]
+print(c[1], c[2])
diff --git a/html/examples/flower.jpg b/html/examples/flower.jpg
new file mode 100644
index 0000000..2b9dbf1
--- /dev/null
+++ b/html/examples/flower.jpg
Binary files differ
diff --git a/html/download/glut_capture.c b/html/examples/glut_capture.c
index e8e2620..80aadd2 100644
--- a/html/download/glut_capture.c
+++ b/html/examples/glut_capture.c
@@ -4,7 +4,7 @@
OpenGL for drawing
IM for image I/O and capture
- Needs "glut32.lib", "vfw32.lib", "strmiids.lib",
+ Needs "opengl32.lib", "glu32.lib", "glut32.lib", "vfw32.lib", "strmiids.lib",
"im.lib", "im_capture.lib", "im_avi.lib" and "im_process.lib".
Control Keys:
@@ -146,7 +146,10 @@ void idle(void)
capture_process(user_key, image, back_image);
if (video_file)
+ {
+ imFileWriteImageInfo(video_file, image->width, image->height, IM_RGB, IM_BYTE);
imFileWriteImageData(video_file, image->data[0]);
+ }
}
imConvertPacking(image->data[0], gl_data, image->width, image->height, image->depth, image->data_type, 0);
@@ -344,7 +347,7 @@ int initcapture(void)
printf("No capture device found.\n"); return 0;
}
- /* conects the device */
+ /* connects the device */
if (!imVideoCaptureConnect(myVideoCap, getcapture())) {
imVideoCaptureDestroy(myVideoCap);
printf("Can not connect to capture device.\n"); return 0;
diff --git a/html/download/im_copy.cpp b/html/examples/im_copy.cpp
index cf0e0d5..5b4c8cd 100644
--- a/html/download/im_copy.cpp
+++ b/html/examples/im_copy.cpp
@@ -4,13 +4,15 @@
Needs "im.lib".
- Usage: im_copy <input_file_name> <output_file_name> [<output_format>]
+ Usage: im_copy <input_file_name> <output_file_name> [<output_format> [<output_compression]]
Example: im_copy test.tif test_proc.tif
*/
#include <im.h>
#include <im_util.h>
+#include <im_format_avi.h>
+#include <im_format_wmv.h>
#include <stdio.h>
#include <stdlib.h>
@@ -51,6 +53,9 @@ int main(int argc, char* argv[])
return 0;
}
+// imFormatRegisterAVI();
+// imFormatRegisterWMV();
+
void* data = NULL;
imFile* ifile = NULL;
imFile* ofile = NULL;
@@ -65,21 +70,30 @@ int main(int argc, char* argv[])
int image_count;
imFileGetInfo(ifile, format, compression, &image_count);
- ofile = imFileNew(argv[2], argv[3]? argv[3]: format, &error);
+ ofile = imFileNew(argv[2], (argc < 3)? format: argv[3], &error);
if (!ofile)
goto man_error;
- if (!argv[3])
+ if (argc < 4)
imFileSetInfo(ofile, compression);
+ else
+ imFileSetInfo(ofile, argv[4]);
for (int i = 0; i < image_count; i++)
{
+ int size, max_size = 0;
int width, height, color_mode, data_type;
error = imFileReadImageInfo(ifile, i, &width, &height, &color_mode, &data_type);
if (error != IM_ERR_NONE)
goto man_error;
- data = malloc(imImageDataSize(width, height, color_mode, data_type));
+ size = imImageDataSize(width, height, color_mode, data_type);
+
+ if (size > max_size)
+ {
+ data = realloc(data, size);
+ max_size = size;
+ }
error = imFileReadImageData(ifile, data, 0, -1);
if (error != IM_ERR_NONE)
@@ -96,6 +110,14 @@ int main(int argc, char* argv[])
imFileSetAttribute(ofile, attrib_list[a], attrib_data_type, attrib_count, attrib_data);
}
+ if (imColorModeSpace(color_mode) == IM_MAP)
+ {
+ long palette[256];
+ int palette_count;
+ imFileGetPalette(ifile, palette, &palette_count);
+ imFileSetPalette(ifile, palette, palette_count);
+ }
+
error = imFileWriteImageInfo(ofile, width, height, color_mode, data_type);
if (error != IM_ERR_NONE)
goto man_error;
@@ -103,7 +125,10 @@ int main(int argc, char* argv[])
error = imFileWriteImageData(ofile, data);
if (error != IM_ERR_NONE)
goto man_error;
+
+ printf(".");
}
+ printf("done");
free(data);
imFileClose(ifile);
diff --git a/html/download/im_info.cpp b/html/examples/im_info.cpp
index f9106fd..89ec8c4 100644
--- a/html/download/im_info.cpp
+++ b/html/examples/im_info.cpp
@@ -10,8 +10,13 @@
#include <im.h>
#include <im_util.h>
#include <im_binfile.h>
+#include <im_format_jp2.h>
+#include <im_format_avi.h>
+#include <im_format_wmv.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
void PrintError(int error)
{
@@ -187,10 +192,12 @@ void PrintImageInfo(const char* file_name)
imFileClose(ifile);
}
-#include <windows.h>
-
int main(int argc, char* argv[])
{
+// imFormatRegisterJP2();
+// imFormatRegisterAVI();
+// imFormatRegisterWMV();
+
if (argc < 2)
{
printf("Invalid number of arguments.\n");
@@ -201,3 +208,4 @@ int main(int argc, char* argv[])
return 1;
}
+
diff --git a/html/download/im_view.c b/html/examples/im_view.c
index d9e2b72..e271394 100644
--- a/html/download/im_view.c
+++ b/html/examples/im_view.c
@@ -6,6 +6,7 @@
Example: im_view test.tif
+
Click on image to open another file.
*/
@@ -18,6 +19,7 @@
#include <stdio.h>
#include <string.h>
+
static int disable_repaint = 0; /* used to optimize repaint, while opening a new file */
static void PrintError(int error)
@@ -25,25 +27,25 @@ static void PrintError(int error)
switch (error)
{
case IM_ERR_OPEN:
- printf("Error Opening File.\n");
+ IupMessage("IM", "Error Opening File.");
break;
case IM_ERR_MEM:
- printf("Insuficient memory.\n");
+ IupMessage("IM", "Insuficient memory.");
break;
case IM_ERR_ACCESS:
- printf("Error Accessing File.\n");
+ IupMessage("IM", "Error Accessing File.");
break;
case IM_ERR_DATA:
- printf("Image type not Suported.\n");
+ IupMessage("IM", "Image type not Suported.");
break;
case IM_ERR_FORMAT:
- printf("Invalid Format.\n");
+ IupMessage("IM", "Invalid Format.");
break;
case IM_ERR_COMPRESS:
- printf("Invalid or unsupported compression.\n");
+ IupMessage("IM", "Invalid or unsupported compression.");
break;
default:
- printf("Unknown Error.\n");
+ IupMessage("IM", "Unknown Error.");
}
}
@@ -55,19 +57,19 @@ static int cbRepaint(Ihandle* iup_canvas)
if (!cd_canvas || disable_repaint)
return IUP_DEFAULT;
- cdActivate(cd_canvas);
- cdClear();
+ cdCanvasActivate(cd_canvas);
+ cdCanvasClear(cd_canvas);
if (!image)
return IUP_DEFAULT;
imcdCanvasPutImage(cd_canvas, image, 0, 0, image->width, image->height, 0, 0, 0, 0);
- cdFlush();
+ cdCanvasFlush(cd_canvas);
return IUP_DEFAULT;
}
-
+
static void ShowImage(char* file_name, Ihandle* iup_dialog)
{
int error;
@@ -76,11 +78,8 @@ static void ShowImage(char* file_name, Ihandle* iup_dialog)
IupSetAttribute(iup_dialog, "imImage", NULL);
image = imFileImageLoadBitmap(file_name, 0, &error);
- if (!image)
- {
- PrintError(error);
- return;
- }
+ if (error) PrintError(error);
+ if (!image) return;
IupSetAttribute(iup_dialog, "imImage", (char*)image);
IupStoreAttribute(iup_dialog, "TITLE", file_name);
@@ -116,6 +115,9 @@ static int cbClose(Ihandle* iup_dialog)
if (cd_canvas) cdKillCanvas(cd_canvas);
if (image) imImageDestroy(image);
+ IupSetAttribute(iup_dialog, "cdCanvas", NULL);
+ IupSetAttribute(iup_dialog, "imImage", NULL);
+
return IUP_CLOSE;
}
@@ -145,11 +147,14 @@ static Ihandle* CreateDialog(void)
return iup_dialog;
}
+//#include "im_format_avi.h"
+
int main(int argc, char* argv[])
{
Ihandle* dlg;
- IupOpen();
+ //imFormatRegisterAVI();
+ IupOpen(&argc, &argv);
dlg = CreateDialog();
diff --git a/html/examples/index.lua b/html/examples/index.lua
new file mode 100644
index 0000000..1c4c1e4
--- /dev/null
+++ b/html/examples/index.lua
@@ -0,0 +1,18 @@
+require"imlua"
+
+local filename = "lena.jpg"
+local image = im.FileImageLoad(filename)
+
+local r = image[0]
+local g = image[1]
+local b = image[2]
+
+for row = 0, image:Height() - 1, 10 do
+ for column = 0, image:Width() - 1, 10 do
+ r[row][column] = 0
+ g[row][column] = 0
+ b[row][column] = 0
+ end
+end
+
+image:Save("lena_indexing.bmp", "BMP")
diff --git a/html/examples/info.lua b/html/examples/info.lua
new file mode 100644
index 0000000..b1afb2a
--- /dev/null
+++ b/html/examples/info.lua
@@ -0,0 +1,149 @@
+require"imlua"
+require"lfs"
+
+function PrintError(error)
+ local msg = {}
+ msg[im.ERR_OPEN] = "Error Opening File."
+ msg[im.ERR_MEM] = "Insuficient memory."
+ msg[im.ERR_ACCESS] = "Error Accessing File."
+ msg[im.ERR_DATA] = "Image type not Suported."
+ msg[im.ERR_FORMAT] = "Invalid Format."
+ msg[im.ERR_COMPRESS] = "Invalid or unsupported compression."
+
+ if msg[error] then
+ print(msg[error])
+ else
+ print("Unknown Error.")
+ end
+end
+
+function FindZero(data)
+ if (not data) then return false end
+ for i = 1, table.getn(data) do
+ if data[i] == 0 then
+ return true
+ end
+ end
+ return false
+end
+
+function AttribData2Str(data, data_type)
+ local data_str
+
+ if data_type == im.BYTE then
+ data_str = string.format("%3d", data[1])
+ elseif data_type == im.USHORT then
+ data_str = string.format("%5d", data[1])
+ elseif data_type == im.INT then
+ data_str = string.format("%5d", data[1])
+ elseif data_type == im.FLOAT then
+ data_str = string.format("%5.2f", data[1])
+ elseif data_type == im.CFLOAT then
+ data_str = string.format("%5.2f, %5.2f", data[1], data[2])
+ end
+
+ return data_str
+end
+
+function GetSizeDesc(size)
+ local size_desc
+
+ if size < 1024 then
+ size_desc = "b"
+ else
+ size = size / 1024
+
+ if size < 1024 then
+ size_desc = "Kb"
+ else
+ size = size / 1024
+ size_desc = "Mb"
+ end
+ end
+
+ return size, size_desc
+end
+
+function FileSize(file_name)
+ if lfs then
+ local attr = lfs.attributes(file_name)
+ return attr.size
+ else
+ return 0
+ end
+end
+
+function PrintImageInfo(file_name)
+ print("IM Info")
+ print(string.format(" File Name:\n %s", file_name))
+
+ local ifile, error = im.FileOpen(file_name)
+ if not ifile then
+ PrintError(error)
+ return nil
+ end
+
+ local file_size = FileSize(file_name)
+
+ print(string.format(" File Size: %.2f %s", GetSizeDesc(file_size)))
+
+ local format, compression, image_count = ifile:GetInfo()
+
+ local error, format_desc = im.FormatInfo(format)
+ print(string.format(" Format: %s - %s", format, format_desc))
+ print(string.format(" Compression: %s", compression))
+ print(string.format(" Image Count: %d", image_count))
+ for i = 1, image_count do
+ local error, width, height, color_mode, data_type = ifile:ReadImageInfo(i-1)
+ if width == nil then
+ PrintError(height)
+ ifile:Close()
+ return nil
+ end
+
+ print(string.format(" Image #%d", i))
+ print(string.format(" Width: %d", width))
+ print(string.format(" Height: %d", height))
+ print(string.format(" Color Space: %s", im.ColorModeSpaceName(color_mode)))
+ print(string.format(" Has Alpha: %s", im.ColorModeHasAlpha(color_mode) and "Yes" or "No"))
+ print(string.format(" Is Packed: %s", im.ColorModeIsPacked(color_mode) and "Yes" or "No"))
+ print(string.format(" Is Top Down: %s", im.ColorModeIsTopDown(color_mode) and "Yes" or "No"))
+ print(string.format(" Data Type: %s", im.DataTypeName(data_type)))
+
+ local image_size = im.ImageDataSize(width, height, color_mode, data_type)
+ print(string.format(" Data Size: %.2f %s", GetSizeDesc(image_size)))
+
+ local attrib_list = ifile:GetAttributeList()
+ for a = 1, table.getn(attrib_list) do
+ if a == 1 then
+ print(" Attributes:")
+ end
+
+ local attrib_data, attrib_data_type = ifile:GetAttribute(attrib_list[a])
+
+ if table.getn(attrib_data) == 1 then
+ print(string.format(" %s: %s", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type)))
+ elseif attrib_data_type == im.BYTE and FindZero(attrib_data) then
+ attrib_data = ifile:GetAttribute(attrib_list[a], true)
+ print(string.format(" %s: %s", attrib_list[a], attrib_data))
+ else
+ print(string.format(" %s: %s ...", attrib_list[a], AttribData2Str(attrib_data, attrib_data_type)))
+ end
+ end
+ end
+
+ ifile:Close()
+end
+
+function main(arg)
+ if (not arg or table.getn(arg) < 1) then
+ print("Invalid number of arguments.")
+ return nil
+ end
+
+ PrintImageInfo(arg[1])
+ return 1
+end
+
+main(arg)
+--PrintImageInfo("lena.jpg")
diff --git a/html/examples/iupglview.c b/html/examples/iupglview.c
new file mode 100644
index 0000000..93e0054
--- /dev/null
+++ b/html/examples/iupglview.c
@@ -0,0 +1,237 @@
+
+#ifdef WIN32
+#include <windows.h> /* necessary because of the Microsoft OpenGL headers dependency */
+#endif
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include <iup.h>
+#include <iupgl.h>
+
+#include <im.h>
+#include <im_image.h>
+#include <im_util.h>
+#include <im_convert.h>
+
+int app_repaint_cb(Ihandle* self)
+{
+ unsigned char* gl_data = (unsigned char*)IupGetAttribute(self, "APP_GL_DATA");
+ int width = IupGetInt(self, "APP_GL_WIDTH");
+ int height = IupGetInt(self, "APP_GL_HEIGHT");
+ IupGLMakeCurrent(self); /* activates this GL Canvas as the current drawing area. */
+ glClear(GL_COLOR_BUFFER_BIT); /* clears the back buffer */
+
+ if (gl_data)
+ {
+ /* Draws the captured image at (0,0) */
+ glRasterPos2f(0.f, 0.f);
+ glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, gl_data);
+ }
+
+ IupGLSwapBuffers(self); /* swap data from back buffer to front buffer */
+ return IUP_DEFAULT;
+}
+
+void appGLInit(int width, int height)
+{
+ glClearColor(0., 0., 0., 1.0); /* window background */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /* data alignment is 1 */
+
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D (0.0, (GLdouble)width, 0.0, (GLdouble)height);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+int app_resize_cb(Ihandle* self, int width, int height)
+{
+ IupGLMakeCurrent(self);
+ appGLInit(width, height);
+ return IUP_DEFAULT;
+}
+
+/* OpenGL does not supports palette based images, so convert to RGB */
+/* this function can also be use for RGBA images */
+void ConvertMapToGLData(unsigned char* data, int count, int depth, long* palette, int palette_count)
+{
+ int c, i;
+ unsigned char r[256], g[256], b[256];
+
+ unsigned char* src_data = data + count-1;
+ unsigned char* dst_data = data + depth*(count-1);
+
+ for (c = 0; c < palette_count; c++)
+ imColorDecode(&r[c], &g[c], &b[c], palette[c]);
+
+ for (i = 0; i < count; i++)
+ {
+ int index = *src_data;
+ *dst_data = r[index];
+ *(dst_data+1) = g[index];
+ *(dst_data+2) = b[index];
+
+ dst_data -= depth;
+ src_data--;
+ }
+}
+
+int app_open_cb(Ihandle* self)
+{
+ imFile* ifile; /* file input */
+ int ret, error;
+ unsigned char* gl_data = (unsigned char*)IupGetAttribute(self, "APP_GL_DATA");
+ char filename[1024] = ".\\*.*";
+
+ /* get a file name */
+ ret = IupGetFile(filename);
+ if (ret == -1)
+ return IUP_DEFAULT;
+
+ ifile = imFileOpen(filename, &error);
+ if (!ifile)
+ {
+ IupMessage("Error", "Error reading image file.");
+ return IUP_DEFAULT;
+ }
+
+ {
+ int width = 0, height = 0, file_color_mode, color_space;
+ Ihandle* dialog = IupGetDialog(self);
+ imFileReadImageInfo(ifile, 0, &width, &height, &file_color_mode, NULL);
+
+ /* alocates the buffers */
+ if (gl_data) free(gl_data);
+ gl_data = malloc(width*height*3);
+ IupSetAttribute(dialog, "APP_GL_DATA", gl_data);
+ IupSetfAttribute(dialog, "APP_GL_WIDTH", "%d", width);
+ IupSetfAttribute(dialog, "APP_GL_HEIGHT", "%d", height);
+
+ imFileReadImageData(ifile, gl_data, 1, IM_PACKED);
+
+ color_space = imColorModeSpace(file_color_mode);
+ if (color_space == IM_MAP || color_space == IM_GRAY || color_space == IM_BINARY)
+ {
+ long palette[256];
+ int palette_count;
+ imFileGetPalette(ifile, palette, &palette_count);
+ ConvertMapToGLData(gl_data, width*height, 3, palette, palette_count);
+ }
+ }
+
+ imFileClose(ifile);
+
+ return IUP_DEFAULT;
+}
+
+int app_exit_cb(Ihandle *self)
+{
+ unsigned char* gl_data = (unsigned char*)IupGetAttribute(self, "APP_GL_DATA");
+
+ /* destroy buffers */
+ if (gl_data)
+ free(gl_data);
+
+ return IUP_CLOSE;
+}
+
+int app_about_cb(Ihandle *self)
+{
+ IupMessagef("About", "IUPGLView 1.0\n"
+ "Tecgraf/PUC-Rio\n"
+ " ---------------- \n"
+ "IUP Version %s\n"
+ "IM Version %s\n"
+ " ---------------- \n"
+ "OpenGL:\n"
+ " Vendor: %s\n"
+ " Renderer: %s\n"
+ " Version: %s\n"
+ , IUP_RELEASE_VERSION, IM_VERSION,
+ glGetString(GL_VENDOR),glGetString(GL_RENDERER),glGetString(GL_VERSION));
+ return IUP_DEFAULT;
+}
+
+void mainMenuCreate(void)
+{
+ Ihandle* file_menu = IupMenu(
+ IupItem( "Open...", "app_open_cb"),
+ IupSeparator(),
+ IupItem( "Exit", "app_exit_cb"),
+ NULL
+ );
+
+ Ihandle* menu = IupMenu(
+ IupSubmenu("File", file_menu),
+ NULL
+ );
+
+ /* this will be used by the dialog */
+ IupSetHandle("app_menu", menu);
+
+ IupSetFunction("app_open_cb", (Icallback)app_open_cb);
+ IupSetFunction("app_exit_cb", (Icallback)app_exit_cb);
+}
+
+void mainDialogCreate(void)
+{
+ Ihandle *dialog, *box, *canvas;
+
+ /* initialize interface */
+
+ /* canvas for the image */
+
+ canvas = IupGLCanvas("app_repaint_cb");
+ IupSetAttribute(canvas, "BORDER", "NO");
+ IupSetAttribute(canvas, "BUFFER", "DOUBLE"); /* use double buffer */
+ IupSetAttribute(canvas, "RESIZE_CB", "app_resize_cb"); /* configure the resize callback */
+
+ IupSetFunction("app_resize_cb", (Icallback)app_resize_cb);
+ IupSetFunction("app_repaint_cb", (Icallback)app_repaint_cb);
+
+ /* this is the most external box that puts together
+ the toolbar, the two canvas and the status bar */
+ box = IupSetAttributes(IupHbox(
+ canvas,
+ NULL), "MARGIN=10x10");
+
+ /* create the dialog and set its attributes */
+
+ mainMenuCreate();
+
+ dialog = IupDialog(box);
+ IupSetAttribute(dialog, "MENU", "app_menu"); /* configure the menu */
+ IupSetAttribute(dialog, "CLOSE_CB", "app_exit_cb");
+ IupSetAttribute(dialog, "TITLE", "IUPGLView");
+ IupSetAttribute(dialog, "RASTERSIZE", "680x380"); /* initial size */
+ IupSetAttribute(dialog, "SHRINK", "YES");
+ IupSetHandle("app_dialog", dialog);
+
+ IupShowXY(dialog, IUP_CENTER, IUP_CENTER);
+}
+
+int main(int argc, char* argv[])
+{
+ /* IUP initialization */
+ IupOpen();
+ IupGLCanvasOpen();
+
+ /* Create and show the main dialog */
+ mainDialogCreate();
+
+ /* IUP event loop */
+ IupMainLoop();
+
+ /* IUP closing */
+ IupClose();
+
+ return 0;
+}
diff --git a/html/examples/lena.jpg b/html/examples/lena.jpg
new file mode 100644
index 0000000..b6bad61
--- /dev/null
+++ b/html/examples/lena.jpg
Binary files differ
diff --git a/html/examples/multimorpho.lua b/html/examples/multimorpho.lua
new file mode 100644
index 0000000..be612c6
--- /dev/null
+++ b/html/examples/multimorpho.lua
@@ -0,0 +1,103 @@
+-- multi-step morphological opening on a binarized image, with increasing structuring element (Se) size:
+-- step 1 - 3x3 Se
+-- step 2 - 5x5 Se
+-- step 3 - 7x7 Se
+-- Step n - (2n+1)x (2n+1) Se
+-- after each step, a count of the objects (white items) in the opened image has to be performed,
+-- and the number of counted items to be saved in a .txt file for easy and fast exporting to excel
+
+require"imlua"
+require"imlua_process"
+
+err_msg = {
+ "No error.",
+ "Error while opening the file.",
+ "Error while accessing the file.",
+ "Invalid or unrecognized file format.",
+ "Invalid or unsupported data.",
+ "Invalid or unsupported compression.",
+ "Insuficient memory",
+ "Interrupted by the counter",
+}
+
+colorspace_str = {
+ "RGB",
+ "MAP",
+ "GRAY",
+ "BINARY",
+ "CMYK",
+ "YCBCR",
+ "LAB",
+ "LUV",
+ "XYZ"
+}
+
+num_step = arg[1]
+file_name1 = arg[2]
+if (not num_step or not file_name1) then
+ print("Must have the number of steps and a file name as parameters.")
+ print(" Can have more than one file name as parameters and can use wildcards.")
+ print(" Usage:")
+ print(" lua multimorpho.lua num_step filename1 filename2 ...")
+ return
+end
+
+print(">>> Multi-step Morphological Opening <<<")
+print("Number of Steps: "..num_step)
+print("")
+
+function ProcessImageFile(file_name, num_step)
+ print("Loading File: "..file_name)
+ image, err = im.FileImageLoad(file_name);
+
+ if (err and err ~= im.ERR_NONE) then
+ error(err_msg[err+1])
+ end
+
+ if (image:ColorSpace() ~= im.BINARY) then
+ error("Invalid Image Color Space. Must be a Binary image [Color Space="..colorspace_str[image:ColorSpace()+1].."].")
+ end
+
+ file_name = file_name..".csv"
+ print("Saving Log File: "..file_name)
+ log = io.open(file_name, "w")
+
+ morph_image = image:Clone()
+ obj_image = im.ImageCreateBased(image, nil, nil, im.GRAY, im.USHORT)
+
+ for step = 1, num_step do
+ kernel_size = 2*step+1
+ print(" Binary Morphology Open [Kernel Size="..kernel_size.."x"..kernel_size.."].")
+ im.ProcessBinMorphOpen(image, morph_image, kernel_size, 1) -- 1 interaction
+
+ num_obj = im.AnalyzeFindRegions(morph_image, obj_image, 4, false) -- 4 connected, ignore objects that touch the border
+ print(" Objects Found: "..num_obj)
+ log:write(kernel_size..";"..num_obj.."\n")
+
+ if (num_obj == 0) then
+ step = num_step
+ end
+
+ obj_image:Clear()
+ morph_image:Clear()
+ end
+
+ log:close()
+ obj_image:Destroy()
+ morph_image:Destroy()
+ image:Destroy()
+ print("Done File.")
+ print("")
+end
+
+file_count = 0
+for index,value in ipairs(arg) do
+ if (index > 1) then
+ ProcessImageFile(arg[index], num_step)
+ file_count = file_count + 1
+ end
+end
+
+if (file_count > 1) then
+ print("Processed "..file_count.." Files.")
+end
diff --git a/html/examples/palette.lua b/html/examples/palette.lua
new file mode 100644
index 0000000..5ec7168
--- /dev/null
+++ b/html/examples/palette.lua
@@ -0,0 +1,6 @@
+require"imlua"
+
+local impal = im.PaletteHotIron()
+print(impal)
+print(im.ColorDecode(impal[1]))
+
diff --git a/html/download/proc_fourier.cpp b/html/examples/proc_fourier.cpp
index 48baa60..48baa60 100644
--- a/html/download/proc_fourier.cpp
+++ b/html/examples/proc_fourier.cpp
diff --git a/html/examples/process.lua b/html/examples/process.lua
new file mode 100644
index 0000000..5a32586
--- /dev/null
+++ b/html/examples/process.lua
@@ -0,0 +1,50 @@
+require"imlua"
+require"imlua_process"
+
+function save_histogram (hist, filename, format)
+ local height = 200 -- altura da imagem
+ local max = math.max(unpack(hist)) -- pega o maior valor do histograma
+ local n = table.getn(hist) + 1 -- zero-based
+ local image = im.ImageCreate(n, height, im.GRAY, im.BYTE) -- cria a imagem
+ local white = 255
+ local black = 0
+
+ local render = function (x, y, d, param)
+ local v = hist[x] / max
+ local h = v * height
+ if y <= h then return black end
+ return white
+ end
+
+ im.ProcessRenderOp(image, render, "histogram", {}, 0)
+ image:Save(filename, format)
+end
+
+local filename = "lena.jpg"
+
+local image = im.FileImageLoad(filename)
+
+save_histogram(im.CalcHistogram(image, 0, 0), "lena_histogram_R.gif", "GIF")
+save_histogram(im.CalcHistogram(image, 1, 0), "lena_histogram_G.gif", "GIF")
+save_histogram(im.CalcHistogram(image, 2, 0), "lena_histogram_B.gif", "GIF")
+save_histogram(im.CalcGrayHistogram(image, 0), "lena_histogram_gray.gif", "GIF")
+
+local r = im.ImageCreate(image:Width(), image:Height(), im.GRAY, image:DataType())
+local g = im.ImageCreate(image:Width(), image:Height(), im.GRAY, image:DataType())
+local b = im.ImageCreate(image:Width(), image:Height(), im.GRAY, image:DataType())
+im.ProcessSplitComponents(image, { r, g, b})
+r:Save("lena_r.jpg", "JPEG")
+g:Save("lena_g.jpg", "JPEG")
+b:Save("lena_b.jpg", "JPEG")
+
+local rgb = image:Clone()
+im.ProcessMergeComponents({r, g, b}, rgb)
+rgb:Save("lena_rgb.jpg", "JPEG")
+
+local replace = image:Duplicate()
+im.ProcessReplaceColor(image, replace, { 146, 93, 145 }, { 255, 0, 255 })
+replace:Save("lena_replace.jpg", "JPEG")
+
+local bitmask = image:Duplicate()
+im.ProcessBitMask(image, bitmask, "01111010", im.BIT_XOR)
+replace:Save("lena_bitmask.jpg", "JPEG")
diff --git a/html/examples/process_new.lua b/html/examples/process_new.lua
new file mode 100644
index 0000000..93ebcce
--- /dev/null
+++ b/html/examples/process_new.lua
@@ -0,0 +1,44 @@
+require"imlua"
+require"imlua_process"
+
+function save_histogram (hist, filename, format)
+ local height = 200 -- altura da imagem
+ local max = math.max(unpack(hist)) -- pega o maior valor do histograma
+ local n = table.getn(hist) + 1 -- zero-based
+ local image = im.ImageCreate(n, height, im.GRAY, im.BYTE) -- cria a imagem
+ local white = 255
+ local black = 0
+
+ local render = function (x, y, d, param)
+ local v = hist[x] / max
+ local h = v * height
+ if y <= h then return black end
+ return white
+ end
+
+ im.ProcessRenderOp(image, render, "histogram", {}, 0)
+ image:Save(filename, format)
+end
+
+local filename = "lena.jpg"
+
+local image = im.FileImageLoad(filename)
+
+save_histogram(im.CalcHistogram(image, 0, 0), "lena_histogram_R.gif", "GIF")
+save_histogram(im.CalcHistogram(image, 1, 0), "lena_histogram_G.gif", "GIF")
+save_histogram(im.CalcHistogram(image, 2, 0), "lena_histogram_B.gif", "GIF")
+save_histogram(im.CalcGrayHistogram(image, 0), "lena_histogram_gray.gif", "GIF")
+
+local r, g, b = im.ProcessSplitComponentsNew(image)
+r:Save("lena_r.jpg", "JPEG")
+g:Save("lena_g.jpg", "JPEG")
+b:Save("lena_b.jpg", "JPEG")
+
+local rgb = im.ProcessMergeComponentsNew({r, g, b})
+rgb:Save("lena_rgb.jpg", "JPEG")
+
+local replace = im.ProcessReplaceColorNew(image, { 146, 93, 145 }, { 255, 0, 255 })
+replace:Save("lena_replace.jpg", "JPEG")
+
+local bitmask = im.ProcessBitMaskNew(image, "01111010", im.BIT_XOR)
+replace:Save("lena_bitmask.jpg", "JPEG")
diff --git a/html/examples/render.lua b/html/examples/render.lua
new file mode 100644
index 0000000..b57f906
--- /dev/null
+++ b/html/examples/render.lua
@@ -0,0 +1,50 @@
+require"imlua"
+require"imlua_process"
+
+local image = im.ImageCreate(500, 500, im.RGB, im.BYTE)
+
+im.ProcessRenderRandomNoise(image)
+image:Save("render_noise.bmp", "BMP")
+
+im.ProcessRenderConstant(image, { 128.0, 0.0, 255.0 })
+image:Save("render_constant.bmp", "BMP")
+
+im.ProcessRenderWheel(image, 100, 200)
+image:Save("render_wheel.bmp", "BMP")
+
+im.ProcessRenderTent(image, 300, 200)
+image:Save("render_tent.bmp", "BMP")
+
+im.ProcessRenderRamp(image, 0, 500, 0)
+image:Save("render_ramp.bmp", "BMP")
+
+im.ProcessRenderBox(image, 200, 200)
+image:Save("render_box.bmp", "BMP")
+
+im.ProcessRenderSinc(image, 100.0, 100.0)
+image:Save("render_sinc.bmp", "BMP")
+
+im.ProcessRenderGaussian(image, 100.0)
+image:Save("render_gaussian.bmp", "BMP")
+
+im.ProcessRenderLapOfGaussian(image, 100.0)
+image:Save("render_lapofgaussian.bmp", "BMP")
+
+im.ProcessRenderCosine(image, 100.0, 100.0)
+image:Save("render_cosine.bmp", "BMP")
+
+im.ProcessRenderGrid(image, 100.0, 100.0)
+image:Save("render_grid.bmp", "BMP")
+
+im.ProcessRenderChessboard(image, 100.0, 100.0)
+image:Save("render_chess.bmp", "BMP")
+
+im.ProcessRenderCone(image, 200)
+image:Save("render_cone.bmp", "BMP")
+
+local render_func = function (x, y, d, param)
+ return math.mod(x + y, 256)
+end
+
+im.ProcessRenderOp(image, render_func, "test", {}, 0)
+image:Save("render_func.bmp", "BMP")
diff --git a/html/examples/render_cd.lua b/html/examples/render_cd.lua
new file mode 100644
index 0000000..4af8a16
--- /dev/null
+++ b/html/examples/render_cd.lua
@@ -0,0 +1,19 @@
+require"imlua"
+require"cdlua"
+require"cdluaim"
+
+local image = im.ImageCreate(500, 500, im.RGB, im.BYTE)
+local canvas = image:cdCreateCanvas() -- Creates a CD_IMAGERGB canvas
+
+canvas:Activate()
+canvas:Background(cd.EncodeColor(255, 255, 255))
+canvas:Clear()
+fgcolor = cd.EncodeColor(255, 0, 0) -- red
+fgcolor = cd.EncodeAlpha(fgcolor, 50) -- semi transparent
+canvas:Foreground(fgcolor)
+canvas:Font("Times", cd.BOLD, 24)
+canvas:Text(100, 100, "Test")
+canvas:Line(0,0,100,100)
+canvas:Kill()
+
+image:Save("new.bmp", "BMP")
diff --git a/html/examples/screencapture.lua b/html/examples/screencapture.lua
new file mode 100644
index 0000000..16eb94e
--- /dev/null
+++ b/html/examples/screencapture.lua
@@ -0,0 +1,13 @@
+require"imlua"
+require"cdlua"
+require"cdluaim"
+
+local canvas = cd.CreateCanvas(cd.NATIVEWINDOW, nil)
+canvas:Activate()
+local w, h = canvas:GetSize()
+local image = im.ImageCreate(w, h, im.RGB, im.BYTE)
+image:cdCanvasGetImage(canvas, 0, 0)
+error = image:Save("screencapture.jpg", "JPEG")
+image:Destroy()
+if (error) then print("error = "..error) end
+
diff --git a/html/examples/show_flower.wlua b/html/examples/show_flower.wlua
new file mode 100644
index 0000000..ec97a88
--- /dev/null
+++ b/html/examples/show_flower.wlua
@@ -0,0 +1,31 @@
+require"imlua"
+require"cdlua"
+require"cdluaim"
+require"iuplua"
+require"iupluacd"
+
+image = im.FileImageLoad("flower.jpg") -- directly load the image at index 0. it will open and close the file
+cnv = iup.canvas{rastersize = image:Width().."x"..image:Height(), border = "NO"}
+cnv.image = image -- store the new image in the IUP canvas as an attribute
+
+function cnv:map_cb() -- the CD canvas can only be created when the IUP canvas is mapped
+ self.canvas = cd.CreateCanvas(cd.IUP, self)
+end
+
+function cnv:action() -- called everytime the IUP canvas needs to be repainted
+ self.canvas:Activate()
+ self.canvas:Clear()
+ self.image:cdCanvasPutImageRect(self.canvas, 0, 0, 0, 0, 0, 0, 0, 0) -- use default values
+end
+
+dlg = iup.dialog{cnv}
+
+function dlg:close_cb()
+ cnv.image:Destroy()
+ cnv.canvas:Kill()
+ self:destroy()
+ return iup.IGNORE -- because we destroy the dialog
+end
+
+dlg:show()
+iup.MainLoop()
diff --git a/html/examples/view.wlua b/html/examples/view.wlua
new file mode 100644
index 0000000..60be33e
--- /dev/null
+++ b/html/examples/view.wlua
@@ -0,0 +1,183 @@
+require"imlua"
+require"cdlua"
+require"cdluaim"
+require"iuplua"
+require"iupluacd"
+
+function PrintError(func, error)
+ local msg = {}
+ msg[im.ERR_OPEN] = "Error Opening File."
+ msg[im.ERR_MEM] = "Insuficient memory."
+ msg[im.ERR_ACCESS] = "Error Accessing File."
+ msg[im.ERR_DATA] = "Image type not Suported."
+ msg[im.ERR_FORMAT] = "Invalid Format."
+ msg[im.ERR_COMPRESS] = "Invalid or unsupported compression."
+
+ if msg[error] then
+ print(func..": "..msg[error])
+ else
+ print("Unknown Error.")
+ end
+end
+
+function LoadImage(file_name)
+ local image
+ local ifile, error = im.FileOpen(file_name)
+ if not ifile then
+ PrintError("open", error)
+ return
+ end
+
+ -- load the first image in the file.
+ -- force the image to be converted to a bitmap
+ image, error = ifile:LoadBitmap()
+ if not image then
+ PrintError("load", error)
+ return
+ end
+
+ ifile:Close()
+ return image
+end
+
+
+dlg = nil -- only one dlg
+
+function ShowImage(file_name)
+
+ local image = LoadImage(file_name)
+ if not image then
+ return false
+ end
+
+ if dlg then
+ local old_canvas = dlg.canvas
+ local old_image = dlg.image
+
+ if old_canvas ~= nil then old_canvas:Kill() end
+ if old_image ~= nil then old_image:Destroy() end
+
+ iup.Destroy(dlg)
+ end
+
+ cnv = iup.canvas{}
+
+ function cnv:action()
+ local canvas = dlg.canvas
+ local image = dlg.image
+
+ if (not canvas) then return end
+
+ -- posy is top-down, CD is bottom-top.
+ -- invert scroll reference (YMAX-DY - POSY).
+ y = self.ymax-self.dy - self.posy
+ if (y < 0) then y = 0 end
+
+
+ canvas:Activate()
+ canvas:Clear()
+ x = -self.posx
+ y = -y
+ image:cdCanvasPutImageRect(canvas, x, y, image:Width(), image:Height(), 0, 0, 0, 0)
+ canvas:Flush()
+
+ return iup.DEFAULT
+ end
+
+ function cnv:button_cb()
+ local file_name = "*.*"
+ local error
+
+ file_name, error = iup.GetFile(file_name)
+ if error ~= 0 then
+ return iup.DEFAULT
+ end
+
+ ShowImage(file_name)
+ return iup.DEFAULT
+ end
+
+
+ -- Set the Canvas inicial size (IUP will retain this value).
+ w = image:Width()
+ h = image:Height()
+ if (w > 800) then w = 800 end
+ if (h > 600) then h = 600 end
+ cnv.rastersize = string.format("%dx%d", w, h)
+ cnv.border = "no"
+ cnv.scrollbar = "yes"
+ cnv.xmax = image:Width()-1
+ cnv.ymax = image:Height()-1
+
+ function cnv:resize_cb(w, h)
+ self.dx = w
+ self.dy = h
+ self.posx = self.posx -- needed only in IUP 2.x
+ self.posy = self.posy
+ end
+
+ dlg = iup.dialog{cnv}
+ dlg.title = file_name
+ dlg.cnv = cnv
+ dlg.image = image
+
+ function dlg:close_cb()
+ local canvas = self.canvas
+ local image = self.image
+
+ if canvas then canvas:Kill() end
+ if image then image:Destroy() end
+
+ return iup.CLOSE
+ end
+
+ function dlg:map_cb()
+ canvas = cd.CreateCanvas(cd.IUP, self.cnv)
+ self.canvas = canvas
+ self.posx = 0 -- needed only in IUP 2.x
+ self.posy = 0
+ end
+
+ dlg:show()
+ cnv.rastersize = nil -- to remove the minimum limit
+
+ return true
+end
+
+function main(arg)
+ local file_name = "*.*"
+ local error
+
+ -- Try to get a file name from the command line.
+ if (arg == nil or table.getn(arg) < 2) then
+ file_name, error = iup.GetFile(file_name)
+ if error ~= 0 then
+ return true
+ end
+ else
+ file_name = arg[1]
+ end
+
+ if not ShowImage(file_name) then
+ local Try = true
+ -- If ShowImage returns an error I will try to read another image.
+ -- I can give up on File Open dlg choosing "Cancel".
+ while Try do
+ file_name = "*.*"
+
+ file_name, error = iup.GetFile(file_name)
+ if error ~= 0 then
+ return true
+ end
+
+ if ShowImage(file_name) then
+ Try = false
+ end
+ end
+ end
+
+ iup.MainLoop()
+ return true
+end
+
+main(arg)
diff --git a/include/im_lib.h b/include/im_lib.h
index 80d07f0..aba789f 100644
--- a/include/im_lib.h
+++ b/include/im_lib.h
@@ -33,7 +33,7 @@ extern "C" {
#define IM_COPYRIGHT "Copyright (C) 1994-2009 Tecgraf, PUC-Rio."
#define IM_VERSION "3.4.2"
#define IM_VERSION_NUMBER 304002
-#define IM_VERSION_DATE "2009/06/24"
+#define IM_VERSION_DATE "2009/06/26"
#define IM_DESCRIPTION "Image Representation, Storage, Capture and Processing"
#define IM_NAME "IM - An Imaging Toolkit"
/** @} */