在BigTiff中用whitebackground替换透明度

时间:2018-07-26 09:46:20

标签: python image image-processing imagemagick gdal

我正在使用python将RGBA tiff转换为具有白色背景的RGB tiff。

我正在使用ImageMagick和GDAL库。

我的代码如下:

def add_background_to_rgba_geotiff(source, destination):

convert_rgba_to_rgb_tif(source, destination)
add_metadata_to_new_geotiff_file(source, destination)


def convert_rgba_to_rgb_tif(source, destination):
    # work also with BigTiff
    command = ' '.join(['convert', quote(source),
                        '-background', 'white',
                        '-alpha', 'background',
                        '-alpha', 'off', quote(destination)])
    shell_command.execute_and_log_outputs(command, shell=True)


def add_metadata_to_new_geotiff_file(source, destination):
    RGBA_tif = gdal.Open(source, gdalconst.GA_ReadOnly)
    RGB_tif = gdal.Open(destination, gdalconst.GA_Update)

    RGB_tif.SetMetadata(RGBA_tif.GetMetadata())
    RGB_tif.SetGeoTransform(RGBA_tif.GetGeoTransform())
    RGB_tif.SetProjection(RGBA_tif.GetProjection())

    del (RGBA_tif)
    del (RGB_tif)

def execute_and_log_outputs(command, silence_errors=False, **kwargs):
    shell_process = execute_async(command,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE,
                                  **kwargs)

     (out, err) = shell_process.communicate()

当我尝试使用tiff运行代码时,一切都会很好,但是当我想将其应用于BigTIFF(> 4GB)时,它将失败并显示以下错误:

TIFFWriteDirectoryTagData:超过了最大TIFF文件大小。

有人知道如何将BigTiff与ImageMagick一起使用吗? 还是可以用GDAL做到这一点?在尝试GDAL时,我只获得了黑色背景。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果您检查 ImageMagick 知道的可用格式,则会看到TIFF64:

identify -list format | grep -i tiff

      EPT  EPT       rw-   Encapsulated PostScript with TIFF preview
     EPT2  EPT       rw-   Encapsulated PostScript Level II with TIFF preview
     EPT3  EPT       rw+   Encapsulated PostScript Level III with TIFF preview
   GROUP4* TIFF      rw-   Raw CCITT Group4
     PTIF* TIFF      rw+   Pyramid encoded TIFF
     TIFF* TIFF      rw+   Tagged Image File Format (LIBTIFF, Version 4.0.9)
   TIFF64* TIFF      rw-   Tagged Image File Format (64-bit) (LIBTIFF, Version 4.0.9)

如果您尝试像这样制作TIFF,则会失败:

convert -size 20000x50000 xc:red +noise random a.tif
convert: Maximum TIFF file size exceeded. `TIFFAppendToStrip' @ error/tiff.c/TIFFErrors/652.

因此,通过将TIFF64委托放在输出文件名的前面来强制它获得如下所示的BigTIFF:

convert -size 20000x50000 xc:red +noise random TIFF64:a.tif

它有效。