From c728d0349d294b7546bfe23b342b82ce0c85f623 Mon Sep 17 00:00:00 2001 From: VaDiM Date: Mon, 20 Apr 2026 03:39:38 +0300 Subject: [PATCH] Some fixes for image converters --- AssetStudioGUI/DirectBitmap.cs | 14 ++++++++++--- AssetStudioUtility/SpriteConverter.cs | 26 ++++++++++++------------ AssetStudioUtility/Texture2DConverter.cs | 2 +- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/AssetStudioGUI/DirectBitmap.cs b/AssetStudioGUI/DirectBitmap.cs index 2d88782..703a24d 100644 --- a/AssetStudioGUI/DirectBitmap.cs +++ b/AssetStudioGUI/DirectBitmap.cs @@ -25,7 +25,11 @@ namespace AssetStudioGUI Width = texture2D.m_Width; Height = texture2D.m_Height; var converter = new Texture2DConverter(texture2D); - Bits = BigArrayPool.Shared.Rent(converter.OutputDataSize); + var dataSize = converter.GetImageDataSize(); + if (dataSize <= 0) + return; + + Bits = BigArrayPool.Shared.Rent(dataSize); if (converter.GetBgra32RawImageData(Bits, flip)) { m_handle = GCHandle.Alloc(Bits, GCHandleType.Pinned); @@ -42,7 +46,11 @@ namespace AssetStudioGUI m_bitmap.Dispose(); m_handle.Free(); } - BigArrayPool.Shared.Return(Bits); + if (Bits != null) + { + BigArrayPool.Shared.Return(Bits); + Bits = null; + } } m_bitmap = null; } @@ -55,7 +63,7 @@ namespace AssetStudioGUI public int Height { get; } public int Width { get; } public int Stride => Width * 4; - public byte[] Bits { get; } + public byte[] Bits { get; private set; } public Bitmap Bitmap => m_bitmap; private Bitmap m_bitmap; diff --git a/AssetStudioUtility/SpriteConverter.cs b/AssetStudioUtility/SpriteConverter.cs index bbf33c3..72791d9 100644 --- a/AssetStudioUtility/SpriteConverter.cs +++ b/AssetStudioUtility/SpriteConverter.cs @@ -28,8 +28,8 @@ namespace AssetStudio private float downscaleMultiplier; private SpriteSettings settingsRaw; private bool keepSpriteSize; - private int resultWidth; - private int resultHeight; + private int resultWidth = -1; + private int resultHeight = -1; private bool canConvert; public readonly Texture2D m_Texture2D; @@ -51,11 +51,7 @@ namespace AssetStudio textureRectOffset = spriteAtlasData.textureRectOffset; downscaleMultiplier = spriteAtlasData.downscaleMultiplier; settingsRaw = spriteAtlasData.settingsRaw; - SetResultSpriteSize(); - if (resultWidth > 0 && resultHeight > 0) - { - canConvert = true; - } + canConvert = SetResultSpriteSize(); } } if (!canConvert && m_Sprite.m_RD.texture.TryGet(out m_Texture2D)) @@ -65,22 +61,26 @@ namespace AssetStudio textureRectOffset = m_Sprite.m_RD.textureRectOffset; downscaleMultiplier = m_Sprite.m_RD.downscaleMultiplier; settingsRaw = m_Sprite.m_RD.settingsRaw; - SetResultSpriteSize(); - if (resultWidth > 0 && resultHeight > 0) - { - canConvert = true; - } + canConvert = SetResultSpriteSize(); } } - private void SetResultSpriteSize() + private bool SetResultSpriteSize() { + if (sprite.m_Rect.width <= 0 || textureRect.width <= 0 || sprite.m_Rect.height <= 0 || textureRect.height <= 0) + { + (resultWidth, resultHeight) = (0, 0); + return false; + } + resultWidth = keepSpriteSize ? (int)MathF.Round(sprite.m_Rect.width) : (int)MathF.Round(textureRect.width); resultHeight = keepSpriteSize ? (int)MathF.Round(sprite.m_Rect.height) : (int)MathF.Round(textureRect.height); + + return true; } public bool TryConvertToImage(out Image spriteImage, SpriteMaskMode maskMode) diff --git a/AssetStudioUtility/Texture2DConverter.cs b/AssetStudioUtility/Texture2DConverter.cs index ed7ed87..99e2b68 100644 --- a/AssetStudioUtility/Texture2DConverter.cs +++ b/AssetStudioUtility/Texture2DConverter.cs @@ -22,7 +22,7 @@ namespace AssetStudio private int gobsPerBlock; private Size blockSize; - public int OutputDataSize => outputDataSize; + public int GetImageDataSize() => outputDataSize; public Texture2DConverter(Texture2D m_Texture2D) {