16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M/////////////////////////////////////////////////////////////////////////////////////// 26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// By downloading, copying, installing or using the software you agree to this license. 66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// If you do not agree to this license, do not download, install, 76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// copy or use the software. 86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Intel License Agreement 116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// For Open Source Computer Vision Library 126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved. 146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners. 156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification, 176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met: 186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's of source code must retain the above copyright notice, 206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer. 216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * Redistribution's in binary form must reproduce the above copyright notice, 236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// this list of conditions and the following disclaimer in the documentation 246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and/or other materials provided with the distribution. 256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// * The name of Intel Corporation may not be used to endorse or promote products 276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// derived from this software without specific prior written permission. 286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and 306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied 316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed. 326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct, 336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages 346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services; 356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused 366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability, 376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of 386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage. 396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// 406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/ 416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "_highgui.h" 436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef HAVE_JASPER 456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "grfmt_jpeg2000.h" 476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// JPEG-2000 Filter Factory 496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000::GrFmtJpeg2000() 506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_sign_len = 12; 526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_signature = "\x00\x00\x00\x0cjP \r\n\x87\n"; 536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_description = "JPEG-2000 files (*.jp2)"; 546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_init(); 556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000::~GrFmtJpeg2000() 596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_cleanup(); 616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtReader* GrFmtJpeg2000::NewReader( const char* filename ) 656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtJpeg2000Reader( filename ); 676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtWriter* GrFmtJpeg2000::NewWriter( const char* filename ) 716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return new GrFmtJpeg2000Writer( filename ); 736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////// GrFmtJpeg2000Reader /////////////////// 776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000Reader::GrFmtJpeg2000Reader( const char* filename ) : GrFmtReader( filename ) 796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_stream = 0; 816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_image = 0; 826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000Reader::~GrFmtJpeg2000Reader() 866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid GrFmtJpeg2000Reader::Close() 916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_stream ) 936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_stream_close( m_stream ); 956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_stream = 0; 966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_image ) 996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_destroy( m_image ); 1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_image = 0; 1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn GrFmtReader::Close(); 1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Reader::ReadHeader() 1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_stream = jas_stream_fopen( m_filename, "rb" ); 1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_stream ) 1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_image = jas_image_decode( m_stream, -1, 0 ); 1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_image ) { 1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_width = jas_image_width( m_image ); 1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_height = jas_image_height( m_image ); 1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cntcmpts = 0; // count the known components 1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int numcmpts = jas_image_numcmpts( m_image ); 1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < numcmpts; i++ ) 1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int depth = jas_image_cmptprec( m_image, i ); 1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth > m_bit_depth ) 1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_bit_depth = depth; 1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_bit_depth > 8 ) 1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_bit_depth = 16; 1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( jas_image_cmpttype( m_image, i ) > 2 ) 1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn continue; 1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cntcmpts++; 1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cntcmpts ) 1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_iscolor = (cntcmpts > 1); 1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !result ) 1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Reader::ReadData( uchar* data, int step, int color ) 1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result = false; 1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn color = color > 0 || ( m_iscolor && color < 0 ); 1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_stream && m_image ) 1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool convert; 1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int colorspace; 1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn convert = (jas_image_clrspc( m_image ) != JAS_CLRSPC_SRGB); 1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn colorspace = JAS_CLRSPC_SRGB; 1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn convert = (jas_clrspc_fam( jas_image_clrspc( m_image ) ) != JAS_CLRSPC_FAM_GRAY); 1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn colorspace = JAS_CLRSPC_SGRAY; // TODO GENGRAY or SGRAY? 1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn // convert to the desired colorspace 1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( convert ) 1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_cmprof_t *clrprof = jas_cmprof_createfromclrspc( colorspace ); 1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( clrprof ) 1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_t *img = jas_image_chclrspc( m_image, clrprof, JAS_CMXFORM_INTENT_RELCLR ); 1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( img ) 1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_destroy( m_image ); 1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn m_image = img; 1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fprintf(stderr, "JPEG 2000 LOADER ERROR: cannot convert colorspace\n"); 1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_cmprof_destroy( clrprof ); 1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fprintf(stderr, "JPEG 2000 LOADER ERROR: unable to create colorspace\n"); 1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = true; 1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( result ) 1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ncmpts; 1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int cmptlut[3]; 2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( color ) 2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cmptlut[0] = jas_image_getcmptbytype( m_image, JAS_IMAGE_CT_RGB_B ); 2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cmptlut[1] = jas_image_getcmptbytype( m_image, JAS_IMAGE_CT_RGB_G ); 2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cmptlut[2] = jas_image_getcmptbytype( m_image, JAS_IMAGE_CT_RGB_R ); 2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cmptlut[0] < 0 || cmptlut[1] < 0 || cmptlut[0] < 0 ) 2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ncmpts = 3; 2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn cmptlut[0] = jas_image_getcmptbytype( m_image, JAS_IMAGE_CT_GRAY_Y ); 2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( cmptlut[0] < 0 ) 2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ncmpts = 1; 2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( result ) 2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < ncmpts; i++ ) 2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int maxval = 1 << jas_image_cmptprec( m_image, cmptlut[i] ); 2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int offset = jas_image_cmptsgnd( m_image, cmptlut[i] ) ? maxval / 2 : 0; 2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int yend = jas_image_cmptbry( m_image, cmptlut[i] ); 2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystep = jas_image_cmptvstep( m_image, cmptlut[i] ); 2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xend = jas_image_cmptbrx( m_image, cmptlut[i] ); 2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstep = jas_image_cmpthstep( m_image, cmptlut[i] ); 2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_t *buffer = jas_matrix_create( yend / ystep, xend / xstep ); 2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( buffer ) 2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !jas_image_readcmpt( m_image, cmptlut[i], 0, 0, xend / xstep, yend / ystep, buffer )) 2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( m_bit_depth == 8 || !m_native_depth ) 2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = ReadComponent8u( data + i, buffer, step, cmptlut[i], maxval, offset, ncmpts ); 2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = ReadComponent16u( ((unsigned short *)data) + i, buffer, step / 2, cmptlut[i], maxval, offset, ncmpts ); 2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !result ) 2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn i = ncmpts; 2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = false; 2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_destroy( buffer ); 2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn fprintf(stderr, "JPEG2000 LOADER ERROR: colorspace conversion failed\n" ); 2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn Close(); 2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Reader::ReadComponent8u( uchar *data, jas_matrix_t *buffer, 2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step, int cmpt, 2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int maxval, int offset, int ncmpts ) 2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstart = jas_image_cmpttlx( m_image, cmpt ); 2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xend = jas_image_cmptbrx( m_image, cmpt ); 2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstep = jas_image_cmpthstep( m_image, cmpt ); 2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xoffset = jas_image_tlx( m_image ); 2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystart = jas_image_cmpttly( m_image, cmpt ); 2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int yend = jas_image_cmptbry( m_image, cmpt ); 2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystep = jas_image_cmptvstep( m_image, cmpt ); 2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int yoffset = jas_image_tly( m_image ); 2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int x, y, x1, y1, j; 2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int rshift = cvRound(log(maxval/256.)/log(2.)); 2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int lshift = MAX(0, -rshift); 2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn rshift = MAX(0, rshift); 2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int delta = (rshift > 0 ? 1 << (rshift - 1) : 0) + offset; 2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < yend - ystart; ) 2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_seqent_t* pix_row = &jas_matrix_get( buffer, y / ystep, 0 ); 2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn uchar* dst = data + (y - yoffset) * step - xoffset; 2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xstep == 1 ) 2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( maxval == 256 && offset == 0 ) 2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = pix_row[x]; 2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = CV_CAST_8U(pix); 2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[x] + delta) >> rshift) << lshift; 2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = CV_CAST_8U(pix); 2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( xstep == 2 && offset == 0 ) 2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0, j = 0; x < xend - xstart; x += 2, j++ ) 2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[j] + delta) >> rshift) << lshift; 3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = dst[(x+1)*ncmpts] = CV_CAST_8U(pix); 3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0, j = 0; x < xend - xstart; j++ ) 3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[j] + delta) >> rshift) << lshift; 3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pix = CV_CAST_8U(pix); 3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x1 = x + xstep; x < x1; x++ ) 3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = (uchar)pix; 3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y1 = y + ystep; 3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ++y; y < y1; y++, dst += step ) 3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts + step] = dst[x*ncmpts]; 3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Reader::ReadComponent16u( unsigned short *data, jas_matrix_t *buffer, 3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step, int cmpt, 3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int maxval, int offset, int ncmpts ) 3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstart = jas_image_cmpttlx( m_image, cmpt ); 3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xend = jas_image_cmptbrx( m_image, cmpt ); 3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xstep = jas_image_cmpthstep( m_image, cmpt ); 3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int xoffset = jas_image_tlx( m_image ); 3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystart = jas_image_cmpttly( m_image, cmpt ); 3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int yend = jas_image_cmptbry( m_image, cmpt ); 3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int ystep = jas_image_cmptvstep( m_image, cmpt ); 3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int yoffset = jas_image_tly( m_image ); 3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int x, y, x1, y1, j; 3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int rshift = cvRound(log(maxval/65536.)/log(2.)); 3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int lshift = MAX(0, -rshift); 3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn rshift = MAX(0, rshift); 3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int delta = (rshift > 0 ? 1 << (rshift - 1) : 0) + offset; 3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( y = 0; y < yend - ystart; ) 3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_seqent_t* pix_row = &jas_matrix_get( buffer, y / ystep, 0 ); 3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn ushort* dst = data + (y - yoffset) * step - xoffset; 3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( xstep == 1 ) 3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( maxval == 65536 && offset == 0 ) 3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = pix_row[x]; 3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = CV_CAST_16U(pix); 3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[x] + delta) >> rshift) << lshift; 3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = CV_CAST_16U(pix); 3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else if( xstep == 2 && offset == 0 ) 3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0, j = 0; x < xend - xstart; x += 2, j++ ) 3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[j] + delta) >> rshift) << lshift; 3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = dst[(x+1)*ncmpts] = CV_CAST_16U(pix); 3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0, j = 0; x < xend - xstart; j++ ) 3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int pix = ((pix_row[j] + delta) >> rshift) << lshift; 3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn pix = CV_CAST_16U(pix); 3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x1 = x + xstep; x < x1; x++ ) 3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts] = (ushort)pix; 3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn y1 = y + ystep; 3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( ++y; y < y1; y++, dst += step ) 3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( x = 0; x < xend - xstart; x++ ) 3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn dst[x*ncmpts + step] = dst[x*ncmpts]; 3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/////////////////////// GrFmtJpeg2000Writer /////////////////// 3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000Writer::GrFmtJpeg2000Writer( const char* filename ) : GrFmtWriter( filename ) 3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennGrFmtJpeg2000Writer::~GrFmtJpeg2000Writer() 3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Writer::IsFormatSupported( int depth ) 3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return depth == IPL_DEPTH_8U || depth == IPL_DEPTH_16U; 3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Writer::WriteImage( const uchar* data, int step, 4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int width, int height, int depth, int channels ) 4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( channels > 3 || channels < 1 ) 4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_cmptparm_t component_info[3]; 4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < channels; i++ ) 4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].tlx = 0; 4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].tly = 0; 4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].hstep = 1; 4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].vstep = 1; 4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].width = width; 4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].height = height; 4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].prec = depth; 4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn component_info[i].sgnd = 0; 4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_t *img = jas_image_create( channels, component_info, (channels == 1) ? JAS_CLRSPC_SGRAY : JAS_CLRSPC_SRGB ); 4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( !img ) 4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(channels == 1) 4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_setcmpttype( img, 0, JAS_IMAGE_CT_GRAY_Y ); 4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_setcmpttype( img, 0, JAS_IMAGE_CT_RGB_B ); 4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_setcmpttype( img, 1, JAS_IMAGE_CT_RGB_G ); 4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_setcmpttype( img, 2, JAS_IMAGE_CT_RGB_R ); 4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn bool result; 4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( depth == 8 ) 4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = WriteComponent8u( img, data, step, channels, width, height ); 4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn else 4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = WriteComponent16u( img, (const unsigned short *)data, step / 2, channels, width, height ); 4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( result ) 4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_stream_t *stream = jas_stream_fopen( m_filename, "wb" ); 4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if( stream ) 4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn result = !jas_image_encode( img, stream, jas_image_strtofmt( "jp2" ), "" ); 4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_stream_close( stream ); 4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_destroy( img ); 4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return result; 4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Writer::WriteComponent8u( jas_image_t *img, const uchar *data, 4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step, int ncmpts, int w, int h ) 4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_t *row = jas_matrix_create( 1, w ); 4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(!row) 4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int y = 0; y < h; y++, data += step ) 4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < ncmpts; i++ ) 4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int x = 0; x < w; x++) 4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_setv( row, x, data[x * ncmpts + i] ); 4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_writecmpt( img, i, 0, y, w, 1, row ); 4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_destroy( row ); 4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennbool GrFmtJpeg2000Writer::WriteComponent16u( jas_image_t *img, const unsigned short *data, 4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn int step, int ncmpts, int w, int h ) 4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{ 4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_t *row = jas_matrix_create( 1, w ); 4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn if(!row) 4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return false; 4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int y = 0; y < h; y++, data += step ) 4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int i = 0; i < ncmpts; i++ ) 4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn { 4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn for( int x = 0; x < w; x++) 4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_setv( row, x, data[x * ncmpts + i] ); 4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_image_writecmpt( img, i, 0, y, w, 1, row ); 4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn } 4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn jas_matrix_destroy( row ); 4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn return true; 4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} 4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif 5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn 5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */ 503