/// <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); }
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); } }
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)); }
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(); * } */ }