I am facing this problem a long time!
Using the WWW class I download an image of my host.
When I try to manipulate this image through its pixels, I get this error: SecurityException: No read access to the texture data:!
I understand that this error telling me that I’m not allowed to read and or change the pixels of this image.
http://www.royalpoker.com.br/crossdomain.xml
My TestOnline is accessed on the link:
http://www.royalpoker.com.br/game/webfoto
In the Editor, using the WWW Security Emulation:
If I test on the Browser, or if I test without Security emulation of the editor, I get the error!
Remembering all of you, I have the file release “Crossdomain”, on the host, as I mentioned in the link above!
crossdomain.xml
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
Please test yourself the link I posted. May see the example with a console that returning the same messages of DEBUG Editor!
I’m trying to fix this problem about 6 months and so far, no one has been able to answer me something functional!
MY COMPLETE SCRIPT FOR TEST:
Mask Image for use on sample:
http://www.royalpoker.com.br/game/webfoto/avatarMask.png
using UnityEngine;
using System.Collections;
using System;
using System.Threading;
public class webAvatar : MonoBehaviour
{
public Texture2D tmp { get; set; }
string url = "http://www.royalpoker.com.br/julex.jpg";
public Texture2D mask; //MaskImage for cutOut
void Start()
{
StartCoroutine(LoadAvatar());
}
void OnGUI()
{
if (tmp != null)
GUI.DrawTexture(new Rect(10, 10, 128, 128), tmp);
}
//Load Avatar from WWW
IEnumerator LoadAvatar()
{
WWW www = new WWW(url);
yield return www;
if (www.error != null)
{
Debug.LogWarning(www.error);
}
else
{
Texture2D newT = www.texture;
//www.LoadImageIntoTexture(tmp);
tmp = CreateUsingMaskAlpha(newT, mask);
}
}
//Create Avatar Icon from MASK
Texture2D CreateUsingMaskAlpha(Texture2D diffuse, Texture2D mask)
{
TextureScale.Bilinear(diffuse, 128, 128);
Texture2D result = new Texture2D(diffuse.width, diffuse.height, TextureFormat.ARGB32, false);
Color[] diffuseColors = diffuse.GetPixels();
Color[] maskColors = mask.GetPixels();
for (int i = 0; i < diffuseColors.Length; i++)
{
if (i < maskColors.Length)
{
diffuseColors[i].a = maskColors[i].a;
}
}
result.SetPixels(diffuseColors);
result.Apply();
Debug.Log("Texture"+result.name);
Debug.Log(result.width + "x" + result.height);
return result;
}
//Function for Read and Write pixel for the modfy image origem to avatar
public class TextureScale
{
public class ThreadData
{
public int start;
public int end;
public ThreadData(int s, int e)
{
start = s;
end = e;
}
}
private static Color[] texColors;
private static Color[] newColors;
private static int w;
private static float ratioX;
private static float ratioY;
private static int w2;
private static int finishCount;
private static Mutex mutex;
public static void Point(Texture2D tex, int newWidth, int newHeight)
{
ThreadedScale(tex, newWidth, newHeight, false);
}
public static void Bilinear(Texture2D tex, int newWidth, int newHeight)
{
ThreadedScale(tex, newWidth, newHeight, true);
}
private static void ThreadedScale(Texture2D tex, int newWidth, int newHeight, bool useBilinear)
{
texColors = tex.GetPixels();
newColors = new Color[newWidth * newHeight];
if (useBilinear)
{
ratioX = 1.0f / ((float)newWidth / (tex.width - 1));
ratioY = 1.0f / ((float)newHeight / (tex.height - 1));
}
else
{
ratioX = ((float)tex.width) / newWidth;
ratioY = ((float)tex.height) / newHeight;
}
w = tex.width;
w2 = newWidth;
var cores = Mathf.Min(SystemInfo.processorCount, newHeight);
var slice = newHeight / cores;
finishCount = 0;
if (mutex == null)
{
mutex = new Mutex(false);
}
if (cores > 1)
{
int i = 0;
ThreadData threadData;
for (i = 0; i < cores - 1; i++)
{
threadData = new ThreadData(slice * i, slice * (i + 1));
ParameterizedThreadStart ts = useBilinear ? new ParameterizedThreadStart(BilinearScale) : new ParameterizedThreadStart(PointScale);
Thread thread = new Thread(ts);
thread.Start(threadData);
}
threadData = new ThreadData(slice * i, newHeight);
if (useBilinear)
{
BilinearScale(threadData);
}
else
{
PointScale(threadData);
}
while (finishCount < cores)
{
Thread.Sleep(1);
}
}
else
{
ThreadData threadData = new ThreadData(0, newHeight);
if (useBilinear)
{
BilinearScale(threadData);
}
else
{
PointScale(threadData);
}
}
tex.Resize(newWidth, newHeight);
tex.SetPixels(newColors);
tex.Apply();
}
public static void BilinearScale(System.Object obj)
{
ThreadData threadData = (ThreadData)obj;
for (var y = threadData.start; y < threadData.end; y++)
{
int yFloor = (int)Mathf.Floor(y * ratioY);
var y1 = yFloor * w;
var y2 = (yFloor + 1) * w;
var yw = y * w2;
for (var x = 0; x < w2; x++)
{
int xFloor = (int)Mathf.Floor(x * ratioX);
var xLerp = x * ratioX - xFloor;
newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor + 1], xLerp),
ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor + 1], xLerp),
y * ratioY - yFloor);
}
}
mutex.WaitOne();
finishCount++;
mutex.ReleaseMutex();
}
public static void PointScale(System.Object obj)
{
ThreadData threadData = (ThreadData)obj;
for (var y = threadData.start; y < threadData.end; y++)
{
var thisY = (int)(ratioY * y) * w;
var yw = y * w2;
for (var x = 0; x < w2; x++)
{
newColors[yw + x] = texColors[(int)(thisY + ratioX * x)];
}
}
mutex.WaitOne();
finishCount++;
mutex.ReleaseMutex();
}
private static Color ColorLerpUnclamped(Color c1, Color c2, float value)
{
return new Color(c1.r + (c2.r - c1.r) * value,
c1.g + (c2.g - c1.g) * value,
c1.b + (c2.b - c1.b) * value,
c1.a + (c2.a - c1.a) * value);
}
}
}
For the love of Jesus Christ. Someone be so kind to test my example and give me a solution for this problem? I have this problem a long time and he’s totally affecting my project!
I did everything I found on google and here in the community and absolutely nothing solves !
Tankx brother!.
I Wating!