如何从字节数组创建图像并显示它?
How to create an image from byte array and display it?
我想从图像文件中获取数据并在 Unity 可以读取的纹理中显示该信息。
我能够将像素信息放入字节数组,但屏幕上什么也没有显示。我如何实际显示图像?
pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
int startPoint = 128;
int height = 152;
int width = 152;
target = new Texture2D(height, width);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
timesDone ++;
pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
target.SetPixel(x, y, pixels[x, y]);
}
}
target.Apply();
target.EncodeToJPG();
好吧,(假设您正确获取了像素数据)您必须将创建的纹理分配给某物...
我会使用例如RawImage since it doesn't need a Sprite
(as the UI.Image
component would do - also see the RawImage Manual):
// Reference this in the Inspector
public RawImage image;
//...
pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
int startPoint = 128;
int height = 152;
int width = 152;
target = new Texture2D(height, width);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
timesDone ++;
pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
target.SetPixel(x, y, pixels[x, y]);
}
}
target.Apply();
// You don't need this. Only if you are also going to save it locally
// as an actual *.jpg file or if you are going to
// e.g. upload it later via http POST
//
// In this case however you would have to asign the result
// to a variable in order to use it later
//var rawJpgBytes = target.EncodeToJPG();
// Assign the texture to the RawImage component
image.texture = target;
或者与普通 Image
组件一起使用,使用 Sprite.Create
:
从您的纹理创建一个 Sprite
// Reference this in the Inspector
public Image image;
// ...
var sprite = Sprite.Create(target, new Rect(0.0f, 0.0f, target.width, target.height), new Vector2(0.5f, 0.5f), 100.0f);
image.sprite = sprite;
提示 1
为了获得正确的宽高比,我通常使用了一个小技巧:
- 为此 RawImage 创建父对象
- 在父
的RectTransform
中设置所需的"maximal size"
- 在
RawImage
/Image
旁边(在子对象上)添加 AspectRatioFitter
(also see the AspectRatioFitter Manual) 并将 AspectMode
设置为 FitInParent
.
现在在代码中调整纵横比(从纹理中获取):
public RawImage image;
public AspectRatioFitter fitter;
//...
image.texture = target;
var ratio = target.width / target.height;
fitter.aspectRatio = ratio;
提示 2
对所有像素调用一次SetPixels
比重复调用SetPixel
"cheaper":
// ...
startPoint = 0;
pixels = new Color[width * height]();
for(int i = 0; i < pixels.Length; i++)
{
pixels[i] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
}
target.SetPixels(pixels);
target.Apply();
// ...
(我不知道你的 pcx
格式是如何工作的,但也许你甚至可以使用 LoadRawTextureData
我想从图像文件中获取数据并在 Unity 可以读取的纹理中显示该信息。
我能够将像素信息放入字节数组,但屏幕上什么也没有显示。我如何实际显示图像?
pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
int startPoint = 128;
int height = 152;
int width = 152;
target = new Texture2D(height, width);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
timesDone ++;
pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
target.SetPixel(x, y, pixels[x, y]);
}
}
target.Apply();
target.EncodeToJPG();
好吧,(假设您正确获取了像素数据)您必须将创建的纹理分配给某物...
我会使用例如RawImage since it doesn't need a Sprite
(as the UI.Image
component would do - also see the RawImage Manual):
// Reference this in the Inspector
public RawImage image;
//...
pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
int startPoint = 128;
int height = 152;
int width = 152;
target = new Texture2D(height, width);
for (var y = 0; y < height; y++)
{
for (var x = 0; x < width; x++)
{
timesDone ++;
pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
target.SetPixel(x, y, pixels[x, y]);
}
}
target.Apply();
// You don't need this. Only if you are also going to save it locally
// as an actual *.jpg file or if you are going to
// e.g. upload it later via http POST
//
// In this case however you would have to asign the result
// to a variable in order to use it later
//var rawJpgBytes = target.EncodeToJPG();
// Assign the texture to the RawImage component
image.texture = target;
或者与普通 Image
组件一起使用,使用 Sprite.Create
:
Sprite
// Reference this in the Inspector
public Image image;
// ...
var sprite = Sprite.Create(target, new Rect(0.0f, 0.0f, target.width, target.height), new Vector2(0.5f, 0.5f), 100.0f);
image.sprite = sprite;
提示 1
为了获得正确的宽高比,我通常使用了一个小技巧:
- 为此 RawImage 创建父对象
- 在父 的
- 在
RawImage
/Image
旁边(在子对象上)添加AspectRatioFitter
(also see the AspectRatioFitter Manual) 并将AspectMode
设置为FitInParent
. 现在在代码中调整纵横比(从纹理中获取):
public RawImage image; public AspectRatioFitter fitter; //... image.texture = target; var ratio = target.width / target.height; fitter.aspectRatio = ratio;
RectTransform
中设置所需的"maximal size"
提示 2
对所有像素调用一次SetPixels
比重复调用SetPixel
"cheaper":
// ...
startPoint = 0;
pixels = new Color[width * height]();
for(int i = 0; i < pixels.Length; i++)
{
pixels[i] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
startPoint += 4;
}
target.SetPixels(pixels);
target.Apply();
// ...
(我不知道你的 pcx
格式是如何工作的,但也许你甚至可以使用 LoadRawTextureData