• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Cpper
            C/C++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿
            libpng比較另類(lèi),解碼方式比較奇特,這里記錄下
            以下代碼為使用虛擬IOReader的方式,稍做修改就基于FILE使用
            代碼很詳細(xì),不需額外解釋
            PNGImage::PNGImage(const std::string& filename):
                ReferenceCountedImage(filename),
                data_(
            0)
            {
                IOReader
            * reader = FileSystem::instance()->readFile(filename);
                
            if(reader == 0)
                    
            return;

                png_structp png_ptr 
            = png_create_read_struct(PNG_LIBPNG_VER_STRING, 000);
                
            if(png_ptr == 0)
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                png_infop info_ptr 
            = png_create_info_struct(png_ptr);
                
            if(info_ptr == 0)
                {
                    png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                
            if(setjmp(png_jmpbuf(png_ptr)))
                {
                    png_destroy_read_struct(
            &png_ptr,png_infopp(0),png_infopp(0));
                    reader
            ->close();
                    reader
            ->deleteLater();
                }

                png_set_read_fn( png_ptr,reader,(png_rw_ptr)user_read_data);

                png_set_sig_bytes(png_ptr,
            0);

                png_read_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,
            0);
                
            const unsigned int width = png_get_image_width(png_ptr,info_ptr);
                
            const unsigned int height = png_get_image_height(png_ptr,info_ptr);
                
            const unsigned int bit_depth = png_get_bit_depth(png_ptr,info_ptr);
                
            if(bit_depth != 8)
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                    png_destroy_info_struct(png_ptr,png_infopp(
            &info_ptr));
                    png_destroy_read_struct(
            &png_ptr,png_infopp(0), png_infopp(0));
                }

                
            const png_byte colorType = png_get_color_type(png_ptr, info_ptr);
                
            if((colorType != PNG_COLOR_TYPE_RGB) && (colorType != PNG_COLOR_TYPE_RGB_ALPHA))
                {
                    reader
            ->close();
                    reader
            ->deleteLater();
                    png_destroy_info_struct(png_ptr, png_infopp(
            &info_ptr));
                    png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
                }

                
            const int bytesPerPixel = (colorType == PNG_COLOR_TYPE_RGB) ? 3 : 4;
                
            const int stride = bytesPerPixel * width;

                unsigned 
            char* data = new unsigned char[stride * height];
                png_bytep
            * row_pointers = png_get_rows(png_ptr, info_ptr);
                
            for(unsigned int i = 0; i < height; ++i)
                {
                    
            const unsigned int row = height - i - 1;
                    memcpy(data 
            + (row * stride), row_pointers[i], stride);
                }

                size_.x_ 
            = width;
                size_.y_ 
            = height;
                numberOfBitsPerPixel_ 
            = bytesPerPixel * 8;
                data_ 
            = data;

                reader
            ->close();
                reader
            ->deleteLater();
                png_destroy_info_struct(png_ptr, png_infopp(
            &info_ptr));
                png_destroy_read_struct(
            &png_ptr, png_infopp(0), png_infopp(0));
            }
            posted on 2015-12-29 11:12 ccsdu2009 閱讀(3855) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Game引擎編程基礎(chǔ)
             
            国产精品久久一区二区三区| 狠狠色丁香婷婷久久综合不卡| 26uuu久久五月天| 久久精品无码免费不卡| 久久精品国产网红主播| 久久高清一级毛片| 久久久久高潮毛片免费全部播放| 久久妇女高潮几次MBA| 久久精品人人槡人妻人人玩AV | 一本久久免费视频| 精品久久久久久成人AV| 久久青青草视频| 国产精品美女久久久久av爽| 久久久久久久人妻无码中文字幕爆| 精品久久久久久久久午夜福利| 国内精品久久久久久久久| 久久综合国产乱子伦精品免费| 久久久这里有精品| 一本一道久久精品综合| 久久综合狠狠综合久久综合88| 亚洲欧美一级久久精品| 久久99精品久久久久久不卡| 精品国产乱码久久久久软件| 日韩精品久久无码人妻中文字幕| 日本免费一区二区久久人人澡| 久久久久久A亚洲欧洲AV冫 | 亚洲国产精品高清久久久| 久久久精品免费国产四虎| 久久经典免费视频| 久久久久亚洲AV成人网人人软件| 久久久久亚洲?V成人无码| 无码国内精品久久人妻麻豆按摩| 久久99久久99小草精品免视看| 亚洲国产成人精品91久久久| segui久久国产精品| 狠狠狠色丁香婷婷综合久久五月 | 国产成人精品综合久久久久| 久久天天躁狠狠躁夜夜96流白浆| 日韩欧美亚洲综合久久| 亚洲精品乱码久久久久久自慰 | 国产精品久久久久久久久久影院|