using UnityEngine; using System.IO; using BitMiracle.LibTiff.Classic; public class TiffFileConverterWithLibrary : MonoBehaviour { public string pngPath; public string tiffPath; [ContextMenu("ConvertPngFileToTiff")] void PNG() { ConvertPngFileToTiff(pngPath, tiffPath); } /// /// 从文件路径加载 PNG,并使用 LibTiff.Net 将其转换为 TIFF 文件。 /// /// 源 PNG 文件的完整路径。 /// 目标 TIFF 文件的输出路径。 public static void ConvertPngFileToTiff(string pngFilePath, string outputTiffPath) { if (!File.Exists(pngFilePath)) { Debug.LogError($"Source PNG file not found at: {pngFilePath}"); return; } // 步骤 1: 读取 PNG 文件数据并加载到 Texture2D byte[] fileData = File.ReadAllBytes(pngFilePath); // 创建一个临时的 Texture2D。尺寸无关紧要,LoadImage 会自动调整。 Texture2D pngTexture = new Texture2D(2, 2); // LoadImage 会自动解码 PNG 数据并填充 Texture2D if (!pngTexture.LoadImage(fileData)) { Debug.LogError("Failed to load PNG data into Texture2D."); return; } // 步骤 2: 从 Texture2D 提取像素数据并使用 LibTiff.Net 写入 TIFF 文件 int width = pngTexture.width; int height = pngTexture.height; try { using (Tiff tiff = Tiff.Open(outputTiffPath, "w")) { if (tiff == null) { Debug.LogError("Could not open TIFF file for writing."); return; } tiff.SetField(TiffTag.IMAGEWIDTH, width); tiff.SetField(TiffTag.IMAGELENGTH, height); tiff.SetField(TiffTag.SAMPLESPERPIXEL, 4); // RGBA tiff.SetField(TiffTag.BITSPERSAMPLE, 8); tiff.SetField(TiffTag.ORIENTATION, Orientation.TOPLEFT); tiff.SetField(TiffTag.ROWSPERSTRIP, height); tiff.SetField(TiffTag.XRESOLUTION, 88.0); tiff.SetField(TiffTag.YRESOLUTION, 88.0); tiff.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH); tiff.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); tiff.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB); tiff.SetField(TiffTag.COMPRESSION, Compression.LZW); Color32[] pixels = pngTexture.GetPixels32(); byte[] raster = new byte[width * height * 4]; // LibTiff 需要的像素顺序可能与 Unity 不同,需要垂直翻转 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { Color32 pixel = pixels[(height - 1 - y) * width + x]; int index = (y * width + x) * 4; raster[index] = pixel.r; raster[index + 1] = pixel.g; raster[index + 2] = pixel.b; raster[index + 3] = pixel.a; } } tiff.WriteEncodedStrip(0, raster, raster.Length); tiff.Close(); Debug.Log($"Successfully converted file '{pngFilePath}' to '{outputTiffPath}' using LibTiff.Net"); } } catch (System.Exception ex) { Debug.LogError($"Failed to convert PNG file to TIFF using LibTiff.Net: {ex.Message}"); } finally { // 销毁临时的 Texture2D 对象以释放内存 Object.Destroy(pngTexture); } } // 示例用法 void Start() { return; string sourcePngPath = Path.Combine(Application.streamingAssetsPath, "YourImage.png"); string destinationTiffPath = Path.Combine(Application.persistentDataPath, "output_from_file_libtiff.tif"); #if UNITY_EDITOR || UNITY_STANDALONE ConvertPngFileToTiff(sourcePngPath, destinationTiffPath); #else Debug.LogWarning("Direct file access to StreamingAssets might not work on this platform."); #endif } }