/// <summary> /// 画像のバイト列を得る /// </summary> /// <param name="bytes"></param> /// <param name="texture"></param> /// <returns></returns> static (byte[] bytes, string mine) GetBytesWithMime(Texture2D texture) { #if UNITY_EDITOR var path = UnityPath.FromAsset(texture); if (path.IsUnderAssetsFolder) { if (path.Extension == ".png") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/png" ); } if (path.Extension == ".jpg") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/jpeg" ); } } #endif return ( texture.EncodeToPNG(), "image/png" ); }
static BytesWithMime GetBytesWithMime(Texture texture, glTFTextureTypes textureType) { #if UNITY_EDITOR var path = UnityPath.FromAsset(texture); if (path.IsUnderAssetsFolder) { if (path.Extension == ".png") { return(new BytesWithMime { Bytes = System.IO.File.ReadAllBytes(path.FullPath), Mime = "image/png", }); } if (path.Extension == ".jpg") { return(new BytesWithMime { Bytes = System.IO.File.ReadAllBytes(path.FullPath), Mime = "image/jpeg", }); } } #endif return(new BytesWithMime { Bytes = TextureItem.CopyTexture(texture, TextureIO.GetColorSpace(textureType), null).EncodeToPNG(), Mime = "image/png", }); }
public virtual (Byte[] bytes, string mine) GetBytesWithMime(Texture texture, glTFTextureTypes textureType) { #if UNITY_EDITOR var path = UnityPath.FromAsset(texture); if (path.IsUnderAssetsFolder) { var textureImporter = AssetImporter.GetAtPath(path.Value) as TextureImporter; var getSizeMethod = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance); if (textureImporter != null && getSizeMethod != null) { var args = new object[2] { 0, 0 }; getSizeMethod.Invoke(textureImporter, args); var originalWidth = (int)args[0]; var originalHeight = (int)args[1]; var originalSize = Mathf.Max(originalWidth, originalHeight); var requiredMaxSize = textureImporter.maxTextureSize; // Resized exporting if MaxSize setting value is smaller than original image size. if (originalSize > requiredMaxSize) { return ( TextureConverter.CopyTexture(texture, GetColorSpace(textureType), null).EncodeToPNG(), "image/png" ); } } if (path.Extension == ".png") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/png" ); } if (path.Extension == ".jpg") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/jpeg" ); } } #endif return ( TextureConverter.CopyTexture(texture, TextureIO.GetColorSpace(textureType), null).EncodeToPNG(), "image/png" ); }
/// <summary> /// 画像のバイト列を得る /// </summary> /// <param name="bytes"></param> /// <param name="texture"></param> /// <returns></returns> static (byte[] bytes, string mine) GetBytesWithMime(Texture2D texture) { #if UNITY_EDITOR var path = UnityPath.FromAsset(texture); if (path.IsUnderAssetsFolder) { if (path.Extension == ".png") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/png" ); } if (path.Extension == ".jpg") { return ( System.IO.File.ReadAllBytes(path.FullPath), "image/jpeg" ); } } #endif try { var png = texture.EncodeToPNG(); if (png != null) { return(png, "image/png"); } } catch (Exception ex) { // fail to EncodeToPng // System.ArgumentException: not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings. Debug.LogWarning(ex); } { // try copy and EncodeToPng var copy = TextureConverter.CopyTexture(texture, TextureImportTypes.sRGB, null); var png = copy.EncodeToPNG(); UnityEngine.Object.DestroyImmediate(copy); return(png, "image/png"); } }
public static void ConfigureNormalMap(Texture2D texture) { var path = UnityPath.FromAsset(texture); if (AssetImporter.GetAtPath(path.Value) is TextureImporter textureImporter) { #if VRM_DEVELOP Debug.Log($"{path} => normalmap"); #endif textureImporter.textureType = TextureImporterType.NormalMap; textureImporter.SaveAndReimport(); } else { throw new System.IO.FileNotFoundException($"{path}"); } }
public static void ConfigureLinear(Texture2D texture) { var path = UnityPath.FromAsset(texture); if (AssetImporter.GetAtPath(path.Value) is TextureImporter textureImporter) { #if VRM_DEVELOP Debug.Log($"{path} => linear"); #endif textureImporter.sRGBTexture = false; textureImporter.SaveAndReimport(); } else { throw new System.IO.FileNotFoundException($"{path}"); } }
public static void ConfigureSize(Texture2D texture) { var path = UnityPath.FromAsset(texture); if (AssetImporter.GetAtPath(path.Value) is TextureImporter textureImporter) { var maxSize = Mathf.Max(texture.width, texture.height); textureImporter.maxTextureSize = maxSize > 4096 ? 8192 : maxSize > 2048 ? 4096 : maxSize > 1024 ? 2048 : maxSize > 512 ? 1024 : 512; textureImporter.SaveAndReimport(); } else { throw new System.IO.FileNotFoundException($"{path}"); } }
/// <summary> /// TextureImporter.maxTextureSize が元のテクスチャーより小さいか否かの判定 /// </summary> /// <param name="src"></param> /// <returns></returns> static bool CopyIfMaxTextureSizeIsSmaller(Texture src) { #if UNITY_EDITOR var textureImporter = AssetImporter.GetAtPath(UnityPath.FromAsset(src).Value) as TextureImporter; var getSizeMethod = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance); if (textureImporter != null && getSizeMethod != null) { var args = new object[2] { 0, 0 }; getSizeMethod.Invoke(textureImporter, args); var originalWidth = (int)args[0]; var originalHeight = (int)args[1]; var originalSize = Mathf.Max(originalWidth, originalHeight); if (textureImporter.maxTextureSize < originalSize) { return(true); } } #endif return(false); }
static void CopySRGBWrite(bool isSRGB) { var src = Selection.activeObject as Texture; var texturePath = UnityPath.FromAsset(src); var path = EditorUtility.SaveFilePanel("save prefab", "Assets", Path.GetFileNameWithoutExtension(AddPath(texturePath.FullPath, ".sRGB")), "prefab"); var assetPath = UnityPath.FromFullpath(path); if (!assetPath.IsUnderAssetsFolder) { return; } Debug.LogFormat("[CopySRGBWrite] {0} => {1}", texturePath, assetPath); var renderTexture = new RenderTexture(src.width, src.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); using (var scope = new ColorSpaceScope(isSRGB)) { Graphics.Blit(src, renderTexture); } var dst = new Texture2D(src.width, src.height, TextureFormat.ARGB32, false, RenderTextureReadWrite.sRGB == RenderTextureReadWrite.Linear); dst.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0); dst.Apply(); RenderTexture.active = null; assetPath.CreateAsset(dst); GameObject.DestroyImmediate(renderTexture); }