1 year ago
#359556

silverfox
Compressing Texture2D with SetPixel() return weird colors in Unity
As the title said, I'm compressing an image (inputed as a Texture2D
) by dividing the image into blocks and taking the average r
, g
, and b
value.
Image:
But the result is mostly gray-ish color with a diagonal strip of other colors in the middle:
This is the code for compression:
private void ASCIIConvert()
{
texWidth = tex.width; texHeight = tex.height;
int blockHeight = Mathf.FloorToInt((float)texHeight / neededHeight);
int blockWidth = Mathf.FloorToInt((float)texWidth / neededWidth);
int maxHeight = blockHeight * neededHeight;
int maxWidth = blockWidth * neededWidth;
int numBlockHeight = maxHeight/blockHeight;
int numBlockWidth = maxWidth/blockWidth;
tex2 = new Texture2D(numBlockWidth, numBlockHeight);
for (int idx = 0; idx < maxHeight; idx += blockHeight)
{
int curBlockHeight = Mathf.FloorToInt((float) idx / blockHeight);
for (int j = 0; j < maxWidth; j += blockWidth)
{
float sumr = 0, sumg = 0, sumb = 0;
int curBlockWidth = Mathf.FloorToInt((float) idx / blockWidth);
for (int m = idx * blockHeight; m < idx * blockHeight + blockHeight; m++)
{
for (int n = j * blockWidth; n < j * blockWidth + blockWidth; n++)
{
sumr += tex.GetPixel(n,m).r;
sumg += tex.GetPixel(n,m).g;
sumb += tex.GetPixel(n,m).b;
}
}
sumr /= (blockWidth * blockHeight);
sumg /= (blockWidth * blockHeight);
sumb /= (blockWidth * blockHeight);
tex2.SetPixel(curBlockWidth, curBlockHeight, new Color(sumr, sumg, sumb, 1f));
}
}
tex2.Apply();
//standard
newSprite = Sprite.Create(tex2, new Rect(0.0f, 0.0f, tex2.width, tex2.height), new Vector2(0.5f, 0.5f), 100.0f);
imgContainer.GetComponent<SpriteRenderer>().sprite = newSprite;
}
neededWidth
and neededHeight
are length and width of the wanted compressed texture. Any idea where the compression may have gone wrong?
c#
unity-game-engine
pixel
texture2d
0 Answers
Your Answer