added Image2D.h/.cpp

This commit is contained in:
hyzboy 2021-12-03 18:51:03 +08:00
parent 1a9631dae9
commit e173b88097
2 changed files with 126 additions and 0 deletions

71
Image2D.cpp Normal file
View File

@ -0,0 +1,71 @@
#include"Image2D.h"
struct HalfImage
{
virtual void Process(void *,void *,const uint,const uint,const uint)=0;
};
template<typename T>
struct HalfImageImple:public HalfImage
{
void Process(void *target,void *source,const uint width,const uint height,const uint channels) override
{
const uint line_length=width*channels;
T *tp=(T *)target;
T *sp0=(T *)source;
T *sp1=sp0+channels;
T *sp2=sp0+line_length;
T *sp3=sp1+line_length;
for(uint row=0;row<height;row+=2)
{
for(uint col=0;col<=width;col+=2)
{
for(uint i=0;i<channels;i++)
{
*tp=((*sp0)+(*sp1)+(*sp2)+(*sp3))/T(4);
++tp;
++sp0;
++sp1;
++sp2;
++sp3;
}
sp0+=channels;
sp1+=channels;
sp2+=channels;
sp3+=channels;
}
sp0+=line_length;
sp1+=line_length;
sp2+=line_length;
sp3+=line_length;
}
}
};
Image2D *Image2D::CreateHalfImage()
{
HalfImage *hi;
if(type==PixelDataType::U8 )hi=new HalfImageImple<uint8>;else
if(type==PixelDataType::U16)hi=new HalfImageImple<uint16>;else
if(type==PixelDataType::U32)hi=new HalfImageImple<uint32>;else
if(type==PixelDataType::F32)hi=new HalfImageImple<float>;else
if(type==PixelDataType::F64)hi=new HalfImageImple<double>;else
return(nullptr);
uint hw=width>>1;
uint hh=height>>1;
void *new_data=new uint8[hw*hh*channels];
hi->Process(new_data,data,width,height,channels);
delete hi;
return(new Image2D(hw,hh,channels,type,new_data));
}

55
Image2D.h Normal file
View File

@ -0,0 +1,55 @@
#pragma once
#include<hgl/type/DataType.h>
using namespace hgl;
enum class PixelDataType
{
U8,
U16,
U32,
F32,
F64
};
class Image2D
{
uint width;
uint height;
uint channels;
PixelDataType type;
void *data;
public:
const uint GetWidth()const{return width;}
const uint GetHeight()const{return height;}
const uint GetChannels()const{return channels;}
const PixelDataType GetType()const{return type;}
void *GetData()const{return data;}
public:
Image2D()
{
width=height=channels=0;
}
Image2D(const uint w,const uint h,const uint c,const PixelDataType &pdt,void *ptr)
{
width=w;
height=h;
channels=c;
type=pdt;
data=ptr;
}
~Image2D()
{
delete[] data;
}
Image2D *CreateHalfImage();
};//class Image2D