Example #1
0
        /// <summary>
        /// Sets the compression quality.
        /// </summary>
        /// <param name="compressOptions">Pointer to compression options object.</param>
        /// <param name="quality">Quality of the compression, higher quality tends to take longer.</param>
        public void SetCompressionOptionsQuality(IntPtr compressOptions, CompressionQuality quality)
        {
            if (compressOptions == IntPtr.Zero)
            {
                return;
            }

            LoadIfNotLoaded();

            Functions.nvttSetCompressionOptionsQuality func = GetFunction <Functions.nvttSetCompressionOptionsQuality>(FunctionNames.nvttSetCompressionOptionsQuality);

            func(compressOptions, quality);
        }
Example #2
0
        private ASTCCompressionQuality MapASTCQuality(CompressionQuality compressionQuality)
        {
            switch (compressionQuality)
            {
            case CompressionQuality.Fastest:
                return(ASTCCompressionQuality.veryfast);;

            case CompressionQuality.Fast:
                return(ASTCCompressionQuality.fast);

            case CompressionQuality.Normal:
                return(ASTCCompressionQuality.medium);

            case CompressionQuality.High:
                return(ASTCCompressionQuality.thorough);

            case CompressionQuality.Best:
                return(ASTCCompressionQuality.exhaustive);

            default: return(ASTCCompressionQuality.exhaustive);
            }
        }
Example #3
0
        private PVRTCCompressionQuality MapPVRTCQuality(CompressionQuality compressionQuality)
        {
            switch (compressionQuality)
            {
            case CompressionQuality.Fastest:
                return(PVRTCCompressionQuality.ePVRTCFastest);

            case CompressionQuality.Fast:
                return(PVRTCCompressionQuality.ePVRTCFast);

            case CompressionQuality.Normal:
                return(PVRTCCompressionQuality.ePVRTCNormal);

            case CompressionQuality.High:
                return(PVRTCCompressionQuality.ePVRTCHigh);

            case CompressionQuality.Best:
                return(PVRTCCompressionQuality.ePVRTCBest);

            default: return(PVRTCCompressionQuality.ePVRTCBest);
            }
        }
        protected Tuple <Bitmap, PixelFormat> CompressImage(byte[] originBytes,
                                                            CompressionQuality imgQuality,
                                                            int pageIndex,
                                                            int recursionChance    = 0, //skip for outer call
                                                            float compressionLevel = 0.6f)
        {
            Bitmap      compressedBitmap = null;
            PixelFormat sourcePalette    = PixelFormat.Undefined;

            using (var sourceMs = new MemoryStream(originBytes))
            {
                FREE_IMAGE_LOAD_FLAGS loadFlag;
                FREE_IMAGE_FORMAT     saveFlag;
                FREE_IMAGE_SAVE_FLAGS qualityFlag;

                var imageType = FreeImage.GetFileTypeFromStream(sourceMs);

                switch (imageType)
                {
                case FREE_IMAGE_FORMAT.FIF_PNG:
                    loadFlag    = FREE_IMAGE_LOAD_FLAGS.PNG_IGNOREGAMMA;
                    saveFlag    = FREE_IMAGE_FORMAT.FIF_PNG;
                    qualityFlag = FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION;
                    break;

                case FREE_IMAGE_FORMAT.FIF_JPEG:
                    loadFlag    = FREE_IMAGE_LOAD_FLAGS.JPEG_FAST;
                    saveFlag    = FREE_IMAGE_FORMAT.FIF_JPEG;
                    qualityFlag = imgQuality == CompressionQuality.Average
                            ? FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYAVERAGE
                            : FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYBAD;
                    break;

                default:
                    loadFlag    = FREE_IMAGE_LOAD_FLAGS.JPEG_FAST;
                    saveFlag    = FREE_IMAGE_FORMAT.FIF_JPEG;
                    qualityFlag = FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYBAD;
                    break;
                }

                var sourceBitmap = FreeImage.LoadFromStream(sourceMs, loadFlag);

                if (!sourceBitmap.IsNull)
                {
                    sourcePalette = FreeImage.GetPixelFormat(sourceBitmap);

                    //var dotnetBitmap = FreeImage.GetBitmap(sourceBitmap);
                    //for TEST
                    //FreeImage.Save(saveFlag, sourceBitmap, string.Format("page{0}.jpg", Guid.NewGuid()),qualityFlag);
                    //if (!sourceBitmap.IsNull)
                    //{
                    using (var convertedMs = new MemoryStream())
                    {
                        FreeImage.SaveToStream(sourceBitmap, convertedMs, saveFlag, qualityFlag);
                        compressedBitmap = new Bitmap(convertedMs);
                        //compressedBytes = convertedMs.ToArray();
                    }

                    FreeImage.Unload(sourceBitmap);
                }
            }

            //return new  compressedBytes;
            return(Tuple.Create(compressedBitmap, sourcePalette));
        }
Example #5
0
        public bool Transcode(PixelFormat format, ChannelType channelType, ColorSpace colorSpace, CompressionQuality quality)
        {
            var options = new TranscoderOptions
            {
                sizeOfStruct       = 0x2C,
                pixelFormat        = format,
                channelTypes       = new [] { (int)channelType, (int)channelType, (int)channelType, (int)channelType },
                colorSpace         = colorSpace,
                compressionQuality = quality,
                doDither           = false,
                maxRange           = 1
            };

            return(Transcode(options));
        }
        public override unsafe void LoadAndWriteToStream(FileInfo inputFile, IAssetMeta meta, Stream outputStream)
        {
            bool generateMips          = meta.GetValue("generateMipMaps", true);
            CompressionFormat  format  = meta.GetValue("compressionFormat", CompressionFormat.BC3);
            CompressionQuality quality = meta.GetValue("compressionQuality", CompressionQuality.Balanced);

            using FileStream inputFs = File.OpenRead(inputFile.FullName);

            using Image <Rgba32> imageFile = Image.Load <Rgba32>(inputFs);
            bool      hasTransparency      = imageFile.GetPixelSpan().ToArray().Any(x => x.A < 255);
            BcEncoder encoder = new BcEncoder();

            encoder.OutputOptions.generateMipMaps = generateMips;
            encoder.OutputOptions.format          = format;
            encoder.OutputOptions.fileFormat      = OutputFileFormat.Ktx;
            encoder.OutputOptions.quality         = quality;

            encoder.Encode(imageFile, outputStream);


            /*
             * compressor.Process(out DDSContainer dds);
             * using BinaryWriter writer = new BinaryWriter(outputStream);
             *
             * using (dds) {
             *      KtxHeader header = new KtxHeader();
             *      byte[] id = new byte[] {0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A};
             *      Unsafe.Copy(header.Identifier, ref id[0]);
             *      header.Endianness = 0x04030201;
             *      if (compressed) {
             *              header.GlType = 0; //For compressed textures
             *              header.GlTypeSize = 1; //For compressed textures
             *              header.GlFormat = 0; //For compressed textures
             *              header.GlInternalFormat = hasTransparency
             *                      ? GlInternalFormat.GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
             *                      : GlInternalFormat.GL_COMPRESSED_SRGB8_ETC2;
             *      }
             *      else {
             *              header.GlType = 0x1401; //GL_UNSIGNED_BYTE
             *              header.GlTypeSize = 1; //1 byte
             *              header.GlFormat = 0x1908; //GL_RGBA
             *      }
             *
             *
             *      header.PixelWidth = (uint)dds.MipChains[0][0].Width;
             *      header.PixelHeight = dds.Dimension == TextureDimension.One ?
             *              0 : (uint)dds.MipChains[0][0].Height;
             *      header.PixelDepth = dds.Dimension == TextureDimension.Three ?
             *              (uint)dds.MipChains[0][0].Depth : 0;
             *
             *      header.NumberOfArrayElements = 0;
             *      header.NumberOfFaces = (uint)dds.MipChains.Count;
             *      header.NumberOfMipmapLevels = (uint) dds.MipChains[0].Count;
             *      header.BytesOfKeyValueData = 0;
             *
             *      WriteStruct(writer, header);
             *      bool isCubemap = header.NumberOfFaces == 6 && header.NumberOfArrayElements == 0;
             *
             *      for (int i = 0; i < header.NumberOfMipmapLevels; i++) {
             *              uint imageSize = (uint)dds.MipChains[0][i].SizeInBytes;
             *              writer.Write(imageSize);
             *
             *              for (int j = 0; j < header.NumberOfFaces; j++) {
             *                      var face = dds.MipChains[j][i];
             *                      Span<byte> bytes = new Span<byte>(face.Data.ToPointer(), face.SizeInBytes);
             *                      writer.Write(bytes);
             *                      uint cubePadding = 0u;
             *                      if (isCubemap)
             *                      {
             *                              cubePadding = 3 - ((imageSize + 3) % 4);
             *                      }
             *
             *                      AddPadding(writer, cubePadding);
             *              }
             *
             *              uint mipPaddingBytes = 3 - ((imageSize + 3) % 4);
             *              AddPadding(writer, mipPaddingBytes);
             *      }
             *      writer.Flush();
             * }
             */
        }