//--------------------------------------------------------------------- void ILImageCodec::codeToFile(MemoryDataStreamPtr& input, const String& outFileName, Codec::CodecDataPtr& pData) const { ILuint ImageName; ilGenImages( 1, &ImageName ); ilBindImage( ImageName ); ImageData* pImgData = static_cast< ImageData * >( pData.getPointer() ); PixelBox src(pImgData->width, pImgData->height, pImgData->depth, pImgData->format, input->getPtr()); // Convert image from OGRE to current IL image ILUtil::fromOgre(src); iluFlipImage(); // Implicitly pick DevIL codec ilSaveImage(const_cast< char * >( outFileName.c_str() ) ); // Check if everything was ok ILenum PossibleError = ilGetError() ; if( PossibleError != IL_NO_ERROR ) { ilDeleteImages(1, &ImageName); OGRE_EXCEPT( Exception::ERR_NOT_IMPLEMENTED, "IL Error, could not save file: " + outFileName, iluErrorString(PossibleError) ) ; } ilDeleteImages(1, &ImageName); }
//--------------------------------------------------------------------- DataStreamPtr STBIImageCodec::encode(MemoryDataStreamPtr& input, Codec::CodecDataPtr& pData) const { if(mType != "png") { OGRE_EXCEPT(Exception::ERR_NOT_IMPLEMENTED, "currently only encoding to PNG supported", "STBIImageCodec::encode" ) ; } ImageData* pImgData = static_cast<ImageData*>(pData.getPointer()); int channels = PixelUtil::getComponentCount(pImgData->format); int len; uchar *data = stbi_write_png_to_mem(input->getPtr(), pImgData->width*channels, pImgData->width, pImgData->height, channels, &len); if (!data) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Error encoding image: " + String(stbi_failure_reason()), "STBIImageCodec::encode"); } return DataStreamPtr(new MemoryDataStream(data, len, true)); }