使用 "gdal_translate" 从 .TIF 到 .JPG 如何将背景设置为白色?
Using "gdal_translate" from .TIF to .JPG how to set background to white?
我尝试使用以下行:
gdal_translate -of jpeg -a_nodata 0 -b 1 -b 2 -b 3 c:\myfolder\mytif.tif c:\myfolder\myNewtif.jpg
这会生成具有所需规格的图像,但会将背景变为黑色(透明?),即使原始图像为白色。我可以只用 gdal_translate 完成白色背景吗?
带有掩码的文件的文件转储:
https://filebin.net/f15v63to2x3cc4z0
没有掩码的文件的文件转储:https://filebin.net/kc940hqotcoeny0w
gdalinfo output of a Tif that produces white background as expected:
Driver: GTiff/GeoTIFF
Files: test.tif
Size is 4799, 3196
Metadata:
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_XRESOLUTION=300
TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 3196.0)
Upper Right ( 4799.0, 0.0)
Lower Right ( 4799.0, 3196.0)
Center ( 2399.5, 1598.0)
Band 1 Block=4799x1 Type=Byte, ColorInterp=Red
Band 2 Block=4799x1 Type=Byte, ColorInterp=Green
Band 3 Block=4799x1 Type=Byte, ColorInterp=Blue
Tif that produces black background:
Warning 1: TIFFFetchNormalTag:Incompatible type for "RichTIFFIPTC"; tag ignored
Driver: GTiff/GeoTIFF
Files: 100011_1.tif
Size is 1640, 2401
Metadata:
TIFFTAG_DATETIME=2020:01:13 12:29:55
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_SOFTWARE=Adobe Photoshop 21.0 (Windows)
TIFFTAG_XRESOLUTION=300
TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 2401.0)
Upper Right ( 1640.0, 0.0)
Lower Right ( 1640.0, 2401.0)
Center ( 820.0, 1200.5)
Band 1 Block=1640x39 Type=Byte, ColorInterp=Red
Mask Flags: PER_DATASET ALPHA
Band 2 Block=1640x39 Type=Byte, ColorInterp=Green
Mask Flags: PER_DATASET ALPHA
Band 3 Block=1640x39 Type=Byte, ColorInterp=Blue
Mask Flags: PER_DATASET ALPHA
Band 4 Block=1640x39 Type=Byte, ColorInterp=Alpha
对于以下在翻译后具有黑色背景的图像,gdal 也会产生此警告“Warning 1: TIFFFetchNormalTag: Incompatible type for "RichTIFFIPTC"; tag ignored
”
您在 filebin 上共享的文件包含一个 "alpha" 掩码,正如您在 gdalinfo
的输出中看到的那样。这个文件的mask说的是背景被屏蔽了,而图片的其余部分没有。
例如,如果您使用默认 Ubuntu 查看器显示 tiff,您会看到背景像素被遮盖了(它们显示为棋盘)
如果您检查光栅数据,您还会看到背景中的底层像素是黑色的,而不是白色的。这就是为什么 gdal_translate
在背景中生成带有黑色像素的 jpeg 的原因,因为它们在原始 tiff 文件中确实是黑色的(但被屏蔽掉了)。
如果您绝对希望背景为白色,您可以使用 rasterio
库使用几行 Python 来做到这一点,例如,通过明确地将蒙版像素设置为白色:
import rasterio
with rasterio.open("101679_1.tif") as src:
arr = src.read(masked=True)
# Convert all masked values to white
arr[arr.mask] = 255
# Write to jpeg file
profile = src.profile
profile["count"] = 3
profile["driver"] = "jpeg"
with rasterio.open("test.jpeg", "w", **profile) as dst:
dst.write(arr[:3])
这应该给出以下 jpeg 文件:
我在上面包含的代码片段也适用于已经具有白色背景的 TIF 文件,因为如果文件不包含遮罩,arr[arr.mask] = 255
行将不会执行任何操作。
要处理充满 .tif
个文件的目录,您可以这样做:
from glob import glob
import rasterio
for tif in glob("*.tif"):
with rasterio.open(tif) as src:
arr = src.read(masked=True)
# Convert all masked values to white
arr[arr.mask] = 255
# Write to jpeg file
profile = src.profile
profile["count"] = 3
profile["driver"] = "jpeg"
with rasterio.open(tif.replace(".tif", ".jpeg"), "w", **profile) as dst:
dst.write(arr[:3])
我尝试使用以下行:
gdal_translate -of jpeg -a_nodata 0 -b 1 -b 2 -b 3 c:\myfolder\mytif.tif c:\myfolder\myNewtif.jpg
这会生成具有所需规格的图像,但会将背景变为黑色(透明?),即使原始图像为白色。我可以只用 gdal_translate 完成白色背景吗?
带有掩码的文件的文件转储: https://filebin.net/f15v63to2x3cc4z0
没有掩码的文件的文件转储:https://filebin.net/kc940hqotcoeny0w
gdalinfo output of a Tif that produces white background as expected:
Driver: GTiff/GeoTIFF
Files: test.tif
Size is 4799, 3196
Metadata:
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_XRESOLUTION=300
TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 3196.0)
Upper Right ( 4799.0, 0.0)
Lower Right ( 4799.0, 3196.0)
Center ( 2399.5, 1598.0)
Band 1 Block=4799x1 Type=Byte, ColorInterp=Red
Band 2 Block=4799x1 Type=Byte, ColorInterp=Green
Band 3 Block=4799x1 Type=Byte, ColorInterp=Blue
Tif that produces black background:
Warning 1: TIFFFetchNormalTag:Incompatible type for "RichTIFFIPTC"; tag ignored
Driver: GTiff/GeoTIFF
Files: 100011_1.tif
Size is 1640, 2401
Metadata:
TIFFTAG_DATETIME=2020:01:13 12:29:55
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_SOFTWARE=Adobe Photoshop 21.0 (Windows)
TIFFTAG_XRESOLUTION=300
TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 2401.0)
Upper Right ( 1640.0, 0.0)
Lower Right ( 1640.0, 2401.0)
Center ( 820.0, 1200.5)
Band 1 Block=1640x39 Type=Byte, ColorInterp=Red
Mask Flags: PER_DATASET ALPHA
Band 2 Block=1640x39 Type=Byte, ColorInterp=Green
Mask Flags: PER_DATASET ALPHA
Band 3 Block=1640x39 Type=Byte, ColorInterp=Blue
Mask Flags: PER_DATASET ALPHA
Band 4 Block=1640x39 Type=Byte, ColorInterp=Alpha
对于以下在翻译后具有黑色背景的图像,gdal 也会产生此警告“Warning 1: TIFFFetchNormalTag: Incompatible type for "RichTIFFIPTC"; tag ignored
”
您在 filebin 上共享的文件包含一个 "alpha" 掩码,正如您在 gdalinfo
的输出中看到的那样。这个文件的mask说的是背景被屏蔽了,而图片的其余部分没有。
例如,如果您使用默认 Ubuntu 查看器显示 tiff,您会看到背景像素被遮盖了(它们显示为棋盘)
如果您检查光栅数据,您还会看到背景中的底层像素是黑色的,而不是白色的。这就是为什么 gdal_translate
在背景中生成带有黑色像素的 jpeg 的原因,因为它们在原始 tiff 文件中确实是黑色的(但被屏蔽掉了)。
如果您绝对希望背景为白色,您可以使用 rasterio
库使用几行 Python 来做到这一点,例如,通过明确地将蒙版像素设置为白色:
import rasterio
with rasterio.open("101679_1.tif") as src:
arr = src.read(masked=True)
# Convert all masked values to white
arr[arr.mask] = 255
# Write to jpeg file
profile = src.profile
profile["count"] = 3
profile["driver"] = "jpeg"
with rasterio.open("test.jpeg", "w", **profile) as dst:
dst.write(arr[:3])
这应该给出以下 jpeg 文件:
我在上面包含的代码片段也适用于已经具有白色背景的 TIF 文件,因为如果文件不包含遮罩,arr[arr.mask] = 255
行将不会执行任何操作。
要处理充满 .tif
个文件的目录,您可以这样做:
from glob import glob
import rasterio
for tif in glob("*.tif"):
with rasterio.open(tif) as src:
arr = src.read(masked=True)
# Convert all masked values to white
arr[arr.mask] = 255
# Write to jpeg file
profile = src.profile
profile["count"] = 3
profile["driver"] = "jpeg"
with rasterio.open(tif.replace(".tif", ".jpeg"), "w", **profile) as dst:
dst.write(arr[:3])