glTF exporter: less naive file format detection for textures

This commit is contained in:
Julien Duroure 2020-04-11 15:34:44 +02:00
parent 43148f1749
commit 7a3fdf08f3
3 changed files with 20 additions and 4 deletions

View File

@ -15,7 +15,7 @@
bl_info = {
'name': 'glTF 2.0 format',
'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
"version": (1, 2, 60),
"version": (1, 2, 61),
'blender': (2, 82, 7),
'location': 'File > Import-Export',
'description': 'Import-Export as glTF 2.0',

View File

@ -103,7 +103,7 @@ def __gather_mime_type(sockets_or_slots, export_image, export_settings):
if export_settings["gltf_image_format"] == "AUTO":
image = export_image.blender_image()
if image is not None and image.file_format == 'JPEG':
if image is not None and __is_blender_image_a_jpeg(image):
return "image/jpeg"
return "image/png"
@ -244,3 +244,10 @@ def __get_texname_from_slot(sockets_or_slots, export_settings):
elif isinstance(sockets_or_slots[0], bpy.types.MaterialTextureSlot):
return sockets_or_slots[0].texture.image.name
def __is_blender_image_a_jpeg(image: bpy.types.Image) -> bool:
if image.source != 'FILE':
return False
path = image.filepath_raw.lower()
return path.endswith('.jpg') or path.endswith('.jpeg') or path.endswith('.jpe')

View File

@ -272,15 +272,24 @@ class ExportImage:
def __encode_from_image(self, image: bpy.types.Image) -> bytes:
# See if there is an existing file we can use.
data = None
if image.source == 'FILE' and image.file_format == self.file_format and \
not image.is_dirty:
if image.packed_file is not None:
return image.packed_file.data
data = image.packed_file.data
else:
src_path = bpy.path.abspath(image.filepath_raw)
if os.path.isfile(src_path):
with open(src_path, 'rb') as f:
return f.read()
data = f.read()
# Check magic number is right
if data:
if self.file_format == 'PNG':
if data.startswith(b'\x89PNG'):
return data
elif self.file_format == 'JPEG':
if data.startswith(b'\xff\xd8\xff'):
return data
# Copy to a temp image and save.
tmp_image = None