【问题标题】:Save TIFF with transparency/alpha channel使用透明度/Alpha 通道保存 TIFF
【发布时间】:2018-02-22 14:22:18
【问题描述】:

这是我的问题:

我需要使用包含特定颜色和 alpha 的调色板创建 TIFF 和 PNG。

我实际上能够处理 PNG,但不能处理 TIFF。

我在互联网上搜索,发现 TIFF 应该处理透明度,但并非所有软件都可以。

我尝试了多种加载 TIFF 的方法,但它们都会导致调色板中的 Alpha 值已重置。

所以我认为问题出在我如何保存 TIFF,但我找不到任何其他方式。

以防万一:调色板设置为 #00FFFFFF,然后设置为 #FFXXXXXX、#FEXXXXXX 等。每当我加载 TIFF 时,颜色都会返回:#FFFFFFFF、#FFXXXXXX、#FFXXXXXX 等

创建图像

public static BitmapSource CreateImage()
{
    int width = ImageGenerator.sizeW;
    int height = ImageGenerator.sizeH;
    int bytesPerPixel = (format.BitsPerPixel + 7) / 8;
    int stride = width * bytesPerPixel;
    byte[] pixels = new byte[height * stride];

    List<Color> colors = new List<Color>();
    PopuplateColors(ref colors);

    BitmapPalette myPalette = new BitmapPalette(colors);

    PopulatePixels(height, stride, ref pixels);

    BitmapSource image = BitmapSource.Create(width, height, 96, 96, format, myPalette, pixels, stride);

    if (imageStreamSource != null)
        imageStreamSource.Dispose();

    return image;
}

创建TIFF

public static void CreateTIFF()
{
    BitmapSource image = CreateImage();

    FileStream stream = new FileStream("test.tif", FileMode.Create);
    TiffBitmapEncoder encoder = new TiffBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(image));
    encoder.Save(stream);
    stream.Dispose();
}

获取TIFF

public static ImageBrush GetTIFF()
{
    /* Another try
    BitmapImage bitmap = new BitmapImage();
    bitmap.BeginInit();
    bitmap.UriSource = new Uri("test.tif",UriKind.Relative);
    bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
    bitmap.EndInit();
    imagePalette = bitmap.Palette;

    CreateData(bitmap);
    return new ImageBrush(bitmap);*/

    //The last try i've done, i've looked at the palette through debug
    Bitmap bitmap = new Bitmap("test.tif");
    System.Drawing.Imaging.ColorPalette cp = bitmap.Palette;
    bitmap.MakeTransparent(cp.Entries[0]);

    return new ImageBrush();

    /* How I normally read the TIFF
    TiffBitmapDecoder decoder = new TiffBitmapDecoder(GetImage("test.tif"), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    BitmapSource bitmapSource = decoder.Frames[0];
    imagePalette = bitmapSource.Palette;

    CreateData(bitmapSource);
    return new ImageBrush(bitmapSource);*/
}

【问题讨论】:

    标签: c# wpf tiff


    【解决方案1】:

    调色板或索引颜色 TIFF 不支持颜色图中的 Alpha 值。每个颜色分量的条目为 16 位,但仅存储 R、G、B(并且没有 Alpha 分量)。如果您尝试在颜色图中存储带有 alpha 的 TIFF,则 alpha 将会丢失。

    不过,您可能可以使用单独的“透明度掩码”(一位掩码)来存储 TIFF。这将是一个单独的 IFD,这意味着某些软件可能不会将其与 RGB 值合并以显示透明图像。但如果您控制读写 TIFF 文件的软件,我认为这将是您提高透明度的最佳选择。

    如果您需要颜色图中的透明度信息(并且您控制读取和写入),另一种选择是使颜色图中的第一种颜色始终透明,或者添加具有透明索引的自定义标签您可以设置为透明。您的图像在其他软件中仍应正确显示,但没有透明度。

    查看 TIFF 标签 ColorMapPhotometricInterpretation(还有一个 Indexed 扩展标签,但它不会更改存储在 RGB 图像颜色图中的组件数量)。

    【讨论】:

      猜你喜欢
      • 2019-03-18
      • 2012-01-02
      • 1970-01-01
      • 2013-11-13
      • 2010-12-30
      • 2011-06-05
      • 2020-08-08
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多