71 lines
1.6 KiB
C#
71 lines
1.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using skyscraper5.Skyscraper.IO;
|
|
using skyscraper8.Skyscraper.Drawing;
|
|
|
|
namespace skyscraper8.AnagramViewer.Handlers
|
|
{
|
|
internal class IQHandler : IFileTypeHandler
|
|
{
|
|
public DataType CheckDataType(Stream input)
|
|
{
|
|
byte readUInt8 = input.ReadUInt8();
|
|
if (readUInt8 == 0x41)
|
|
return DataType.Image;
|
|
return DataType.Unknown;
|
|
}
|
|
|
|
public Image AsImage(Stream input)
|
|
{
|
|
IqChartData iqChartData = IqChartData.LoadFrom(input);
|
|
iqChartData.AutoScale();
|
|
|
|
Bitmap bitmap = new Bitmap(256, 256,PixelFormat.Format24bppRgb);
|
|
BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
|
|
|
|
byte[] buffer = new byte[(256 * 256) * 3];
|
|
int oPos = 0;
|
|
for (int y = 0; y < 256; y++)
|
|
{
|
|
for (int x = 0; x < 256; x++)
|
|
{
|
|
byte b = iqChartData.IQ[y][x];
|
|
if (b != 0)
|
|
{
|
|
buffer[oPos] = b; //R
|
|
buffer[oPos + 1] = 0; //G
|
|
buffer[oPos + 2] = (byte)(255 - b); //B
|
|
|
|
buffer[oPos] = (byte)(~buffer[oPos]);
|
|
buffer[oPos + 1] = 0;
|
|
buffer[oPos + 2] = (byte)(~buffer[oPos + 2]);
|
|
}
|
|
else
|
|
{
|
|
buffer[oPos] = 255;
|
|
buffer[oPos + 1] = 255;
|
|
buffer[oPos + 2] = 255;
|
|
}
|
|
|
|
oPos += 3;
|
|
}
|
|
}
|
|
|
|
Marshal.Copy(buffer, 0, bitmapData.Scan0, buffer.Length);
|
|
bitmap.UnlockBits(bitmapData);
|
|
return bitmap;
|
|
}
|
|
|
|
public string AsText(Stream input)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|