You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:15:14