00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <mln/core/image/image2d.hh>
00028 #include <mln/win/rectangle2d.hh>
00029
00030 #include <mln/value/rgb8.hh>
00031
00032 #include <mln/io/ppm/load.hh>
00033 #include <mln/io/ppm/save.hh>
00034
00035 #include <mln/data/compare.hh>
00036
00037 #include "tests/data.hh"
00038
00039
00040 using namespace mln;
00041
00042 typedef value::rgb<23> rgb23;
00043
00044 struct to23bits : mln::Function_v2v<to23bits>
00045 {
00046
00047 typedef rgb23 result;
00048 result operator()(value::rgb8 v) const
00049 {
00050 result ret(v.red().to_enc() * 256,
00051 v.green().to_enc() * 256,
00052 v.blue().to_enc() * 256);
00053 return ret;
00054 }
00055 };
00056
00057 struct to8bits : mln::Function_v2v<to8bits>
00058 {
00059
00060 typedef value::rgb8 result;
00061 result operator()(rgb23 v) const
00062 {
00063 result ret(v.red().to_enc() / 256,
00064 v.green().to_enc() / 256,
00065 v.blue().to_enc() / 256);
00066 return ret;
00067 }
00068 };
00069
00070 int main()
00071 {
00072 using namespace mln;
00073 using value::rgb8;
00074
00075 typedef image2d<rgb8> I;
00076
00077
00078
00079 image2d<rgb8> a = io::ppm::load<rgb8>(MLN_IMG_DIR "/lena.ppm");
00080 image2d<rgb23> b(a.domain());
00081
00082 image2d<rgb8>::fwd_piter p(b.domain());
00083
00084
00085 to23bits f;
00086 for_all(p)
00087 b(p) = f(a(p));
00088 io::ppm::save(b, "ppm23-out23.ppm");
00089
00090
00091 image2d<rgb23>
00092 c = io::ppm::load<rgb23>("ppm23-out23.ppm");
00093 image2d<rgb8> d(a.domain());
00094
00095
00096
00097 to8bits g;
00098 for_all(p)
00099 d(p) = g(c(p));
00100 io::ppm::save(d, "ppm23-out8.ppm");
00101
00102
00103 mln_assertion(d == a);
00104
00105 }