Files
LayaNative2.0/Conch/source/common/imageLib/JCImageRW.h
T
2020-11-11 16:17:13 +08:00

167 lines
4.6 KiB
C++

/**
@file JCImageRW.h
@brief
@author hugao
@version 1.0
@date 2016_5_11
*/
#ifndef __JCImageRW_H__
#define __JCImageRW_H__
#include <memory>
#include <functional>
#define PNG_UINT32 unsigned int
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#else
#include <GLES3/gl3.h>
#endif
namespace laya
{
enum ImageType
{
ImgType_unknow,
ImgType_jpeg,
ImgType_png,
ImgType_gif,
ImgType_ETC1,
ImgType_ETC2,
ImgType_PVR,
};
struct ImageBaseInfo
{
int m_nWidth, m_nHeight, m_nBpp;
};
class BitmapData:public ImageBaseInfo
{
public:
BitmapData();
BitmapData(char* p_pData, int p_nWidth, int p_nHeight );
BitmapData(int p_nWidth, int p_nHeight, bool p_bTranslate, int p_nFillColor );
void releaseData()
{
if(m_pImageData)
{
delete [] m_pImageData;
m_pImageData=0;
}
}
int m_nImageID;
char* m_pImageData;
ImageType m_nImageType;
void reconfigure(int width, int height, int bpp, ImageType imageType);
void copyData(char* dataPtr);
};
#ifndef WEBASM
//参数是对象实例而不是引用。因为实际对象可能是临时对象
typedef std::function<void(BitmapData bmp)> imgDecodeCB;
/** @brief 在函数内部会给 p_pData 分配空间。注意是一维数组,不是二维的 这里只负责解码图片,没有缓存管理等功能。
* 返回的是函数内部分配的指针。需要外部释放
* @param[in] 内存数据
* @param[in] 长度
* @param[in] 获得到的bitmap
* @return 是否解码成功
*/
bool loadImageMemSync( const char* p_pMem, int p_nLenth, BitmapData& p_bmp );
/** @brief
直接加载一个图片文件。
* @param[in] p_pszFile 本地文件的路径,绝对路径。
* @return
返回一个Bitmap对象,注意需要自己手动删除其中的指针。
*/
BitmapData loadLocalImageSync( const char* p_pszFile );
void loadImageMemASync(std::shared_ptr<char> p_pBuff, int p_nLenth, imgDecodeCB p_CB);
ImageType getImgType( const char* p_pMem, int p_nLength );
/** @brief 获得图片的基本信息。要求快速,如果不必解码就不要解码 同步函数
* @param[in] 内存数据
* @param[in] 内存长度
* @param[in] 图片基本信息
* @return 是否解码成功
*/
bool getImageBaseInfo( const char* p_pMem, int p_nLength, ImageBaseInfo& p_Info );
/** @brief 保存png
* @param[in] 图片数据
* @param[in] w
* @param[in] h
* @param[in] 文件名字
* @return 是否保存成功
*/
bool saveAsPng(const char* p_pData, int w, int h, const char* p_pszFile );
/** @brief 保存jpg
* @param[in] 图片数据
* @param[in] 图片信息
* @param[in] 文件名字
* @return 是否保存成功
*/
bool saveAsJpeg(const char* p_pData, ImageBaseInfo& p_Info, const char* p_pszFile );
/** @brief 保存bmp
* @param[in] 图片数据
* @param[in] 图片信息
* @return 是否保存成功
*/
bool saveAsBmp(const char* p_pData, ImageBaseInfo& p_Info);
/** @brief windw是每隔几个采样一个。windh类推。
* @param[in]
* @param[in]
* @param[in]
* @param[out]
* @return 返回的dst是在函数内部分配的
*/
bool downsampleBmp( BitmapData& src, BitmapData& dst, int windw, int windh, bool rbBorder );
/** @brief pFrcation 是4个int表示的宽高缩放。[宽分子,宽分母,高分子,高分母]
* @param[in]
* @param[in]
* @param[in]
* @param[out]
* @return
*/
bool downsampleBmp( BitmapData& src, BitmapData& dst, int* pFrcation, bool rbBorder );
void createGridBmp( BitmapData& out, int w, int h, int gridw);
/** @brief
* 把一个灰度图转换成某种颜色,拷贝到dst中。
* @param[in] dst 目标BitmapData。
* @param[in] nSx 目标bmp的起点x
* @param[in] nSy 目标bmp的起点y
* @param[in] pSrc 源图片。是一个灰度图。灰度值表示颜色的深浅。
* @param[in] nSrcW 源图片的宽
* @param[in] nSrcH 源图片的高
* @param[in] nSrcColor 颜色。
* @return void
*/
void copy8BitBmp( BitmapData& dst, int nSx, int nSy, unsigned char* pSrc, int nSrcW, int nSrcH, int nSrcColor );
void copy32BitBmp(BitmapData& dst, int nSx, int nSy,int nDstW, unsigned char* pSrc, int nSrcW, int nSrcH, int srcPitch);
std::pair<unsigned char*, unsigned long> convertBitmapToJpeg(const char* p_pData, int nWidth, int nHeight, int nBpp);
std::pair<unsigned char*, unsigned long> convertBitmapToPng(const char* p_pData, int nWidth, int nHeight, int nBitDepth);
void convertRGBA8888ToFormat(const unsigned char* data, size_t dataLen, GLenum format, unsigned char** outData, size_t* outDataLen);
#endif
}
//------------------------------------------------------------------------------
#endif //__JCImageRW_H__
//-----------------------------END FILE--------------------------------