You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
4.1 KiB
C#

using System;
namespace DotNetCTFDumper.Utils
{
public static class ImageHelper
{
public static (byte[], int) ReadPoint(byte[] data, int width, int height)
{
byte[] colorArray = new byte[width * height * 4];
int stride = width * 4;
int pad = GetPadding(width, 3);
int position = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
colorArray[(y * stride) + (x * 4) + 0] = data[position];
colorArray[(y * stride) + (x * 4) + 1] = data[position + 1];
colorArray[(y * stride) + (x * 4) + 2] = data[position + 2];
colorArray[(y * stride) + (x * 4) + 3] = 255;
position += 3;
}
position += pad * 3;
}
return (colorArray, position);
}
public static (byte[], int) ReadSixteen(byte[] data, int width, int height)
{
byte[] colorArray = new byte[width * height * 4];
int stride = width * 4;
int pad = GetPadding(width, 2);
int position = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
UInt16 newShort = (ushort) (data[position] | data[position + 1] << 8);
byte r = (byte) ((newShort & 63488) >> 11);
byte g = (byte) ((newShort & 2016) >> 5);
byte b = (byte) ((newShort & 31));
r=(byte) (r << 3);
g=(byte) (g << 2);
b=(byte) (b << 3);
colorArray[(y * stride) + (x * 4) + 2] = r;
colorArray[(y * stride) + (x * 4) + 1] = g;
colorArray[(y * stride) + (x * 4) + 0] = b;
colorArray[(y * stride) + (x * 4) + 3] = 255;
position += 2;
}
position += pad * 2;
}
return (colorArray, position);
}
public static (byte[], int) ReadFifteen(byte[] data, int width, int height)
{
byte[] colorArray = new byte[width * height * 4];
int stride = width * 4;
int pad = GetPadding(width, 2);
int position = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
UInt16 newShort = (ushort) (data[position] | data[position + 1] << 8);
byte r = (byte) ((newShort & 31744) >> 10);
byte g = (byte) ((newShort & 992) >> 5);
byte b = (byte) ((newShort & 31));
r=(byte) (r << 3);
g=(byte) (g << 3);
b=(byte) (b << 3);
colorArray[(y * stride) + (x * 4) + 2] = r;
colorArray[(y * stride) + (x * 4) + 1] = g;
colorArray[(y * stride) + (x * 4) + 0] = b;
colorArray[(y * stride) + (x * 4) + 3] = 255;
position += 2;
}
position += pad * 2;
}
return (colorArray, position);
}
public static byte[,] ReadAlpha(byte[] data, int width, int height, int possition)
{
int pad = GetPadding(width, 1, 4);
byte[,] alpha = new byte[width, height];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
alpha[j, i] = data[possition];
possition += 1;
}
possition += pad;
}
return alpha;
}
public static int GetPadding(int width, int pointSize, int bytes = 2)
{
int pad = bytes - ((width * pointSize) % bytes);
if (pad == bytes)
{
return 0;
}
return (int) Math.Ceiling((double) ((float) pad / (float) pointSize));
}
}
}