如何用JPEG压缩TIF文件?移除Alpha通道并保留地理信息
TIF图像处理功能实现求助
需求
需完成以下操作:
- 打开包含Alpha通道和地理信息的TIF图像文件
- 移除Alpha通道
- 使用JPEG压缩保存为TIF格式文件(保留.TIF后缀),同时保留地理信息
遇到的问题
已通过Python实现该功能,但用C#尝试时,先后测试了三个库均存在问题:
- SixLabors.ImageSharp:无法加载目标TIF文件,抛出异常:
System.NotSupportedException: 'Decoding Tiff images with ExtraSamples is not supported with UnspecifiedData.' - BitMiracle.LibTiff.NET:无法实现JPEG压缩
- Magick.NET:无法完成压缩
目标TIF文件约500MB。
可实现功能的Python代码(效率较低)
from PIL import Image from PIL.TiffImagePlugin import TiffImageFile import os # !!! 请勿使用版本高于10.1.0的Pillow !!! # 在CMD中检查版本:python -m pip show pillow # 高版本会报错:"JPEGSetupEncode: RowsPerStrip must be multiple of 8 for JPEG." # 安装指定版本: # pip install Pillow==10.1.0 # ^^^^^ 以下代码注释中包含该问题的修复方案 file = "C:/users/me/downloads/N1E100a.tif" file_compressed = "C:/users/me/downloads/N1E100a_compressed.tif" print("Starting compression for '" + file + "'...", end =" ") Image.MAX_IMAGE_PIXELS = 900000000 # 加载原始图像获取元数据 imgOriginal = TiffImageFile(file) imgOriginal.load() metaData = imgOriginal.tag_v2 imgOriginal.close() # 保存原始图像为压缩版本 imgReopen = Image.open(file).convert('RGBA') background = Image.new('RGBA', imgReopen.size, (255,255,255)) imgToBeCompressed = Image.alpha_composite(background, imgReopen) imgReopen.close() imgToBeCompressed.save(file_compressed, compression='jpeg') imgToBeCompressed.close() # 打开并将元数据写入新压缩的图像 imgNeedsMetaData = TiffImageFile(file_compressed) imgNeedsMetaData.load() # del metaData[278] # 上述问题的ROWSPERSTRIP修复方案 imgNeedsMetaData.save(file_compressed, tiffinfo=metaData) print("Compression Complete.")
我编写的C#代码(无法加载图像)
using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats.Tiff; using SixLabors.ImageSharp.Processing; using System.IO; namespace MyNamespace { internal class Image { public static void CompressTIFwithJPEG(string ImageFileToCompress, string? CompressedImageFile = null) { using (SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(ImageFileToCompress)) { TiffEncoder encoder = new TiffEncoder { Compression = SixLabors.ImageSharp.Formats.Tiff.Constants.TiffCompression.Jpeg }; string outputFile = CompressedImageFile ?? ImageFileToCompress; image.Save(outputFile); } } } }
内容的提问来源于stack exchange,提问作者ddetding
相关产品推荐
相关产品推荐

