00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020
00021 #ifndef _InsertImage_hpp
00022 #define _InsertImage_hpp
00023
00024 #include<ImLib3D/ImageProcessor.hpp>
00025
00026 namespace IP3D
00027 {
00037 template <class ImageType>
00038 void InsertImage(const ImageType& src,const ImageType& insert,const Vect3Di &pos,ImageType& res);
00039 };
00040
00041
00042 namespace IP3D
00043 {
00044 template <class ImageType>
00045 void
00046 InsertImage(const ImageType& src,const ImageType& insert,const Vect3Di &pos,ImageType& res)
00047 {
00048 if(&res!=&src){res=src;}
00049
00050 RectZone3Di zone(pos,pos+insert.SizeV()-Vect3Di(1,1,1));
00051 typename ImageType::iteratorZone rp(zone);
00052 typename ImageType::const_iteratorFast op;
00053 for( op=insert.begin(),rp=res.begin(); rp!=res.end(); ++op,++rp )
00054 {
00055 *rp=*op;
00056 }
00057 }
00058
00059 template <class ImageType>
00060 void
00061 ResizeImageSupport(const ImageType &src,const Size3D &newSize,ImageType &res0,const typename ImageType::value_type *fillValue=NULL)
00062 {
00063 ImageProcessorArgs<ImageType> args(ImArgs(src),res0);
00064 args.SetDestSize(newSize);
00065 ImageType &res=args.GetDest();
00066
00067 bool hasMask=src.HasMask();
00068 if(hasMask && !res.HasMask()){res.AddMask();}
00069
00070
00071 typename ImageType::value_type background;
00072 if(fillValue){background=*fillValue;}
00073 else
00074 {
00075 SetZero<typename ImageType::value_type>::Set(background,false);
00076 }
00077
00078 for(typename ImageType::iteratorXYZ p=res.begin();p!=res.end();p++)
00079 {
00080 if(src.IsInside(p.Pos()))
00081 {
00082 *p=src(p.Pos());
00083 if(hasMask){res.Mask(p.Pos())=src.Mask(p.Pos());}
00084 }
00085 else
00086 {
00087 *p=background;
00088 if(hasMask){res.Mask(p.Pos())=0;}
00089 }
00090 }
00091 }
00092
00093 }
00094
00095
00096 #endif// _InsertImage_hpp