mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
90 lines
3.2 KiB
C#
90 lines
3.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using BitMiracle.LibTiff;
|
|
using System.IO;
|
|
|
|
namespace Orvid.Graphics.ImageFormats
|
|
{
|
|
public class TiffImage : ImageFormat
|
|
{
|
|
public override void Save(Image i, Stream dest)
|
|
{
|
|
#warning TODO: Fix
|
|
throw new Exception("This Currently Doesn't Work!");
|
|
//Tiff tif = Tiff.OpenForWrite(dest);
|
|
//tif.SetField(TiffTag.ImageWidth, i.Width);
|
|
//tif.SetField(TiffTag.ImageLength, i.Height);
|
|
//tif.SetField(TiffTag.Compression, BitMiracle.LibTiff.Compression.LZW);
|
|
//tif.SetField(TiffTag.Photometric, Photometric.RGB);
|
|
//tif.SetField(TiffTag.RowsPerStrip, i.Height);
|
|
//tif.SetField(TiffTag.BitsPerSample, 8);
|
|
//tif.SetField(TiffTag.SamplesPerPixel, 4);
|
|
//tif.SetField(TiffTag.PlanarConfig, PlanarConfig.Contig);
|
|
//byte[] raster = new byte[i.Height * i.Width * 4];
|
|
//uint loc = 0;
|
|
//Pixel p;
|
|
//for (uint y = 0; y < i.Height; y++)
|
|
//{
|
|
// for (uint x = 0; x < i.Width; x++)
|
|
// {
|
|
// p = i.GetPixel(x, y);
|
|
// raster[loc] = p.R;
|
|
// loc++;
|
|
// raster[loc] = p.G;
|
|
// loc++;
|
|
// raster[loc] = p.B;
|
|
// loc++;
|
|
// raster[loc] = p.A;
|
|
// loc++;
|
|
// }
|
|
//}
|
|
//int stride = raster.Length / i.Height;
|
|
//for (int i2 = 0, offset = 0; i2 < i.Height; i2++)
|
|
//{
|
|
// tif.WriteScanline(raster, offset, i2, 0);
|
|
// offset += stride;
|
|
//}
|
|
}
|
|
|
|
public override Image Load(Stream s)
|
|
{
|
|
Tiff tif = Tiff.Open(s);
|
|
FieldValue[] value = tif.GetField(TiffTag.ImageWidth);
|
|
int width = value[0].ToInt();
|
|
value = tif.GetField(TiffTag.ImageLength);
|
|
int height = value[0].ToInt();
|
|
int[] raster = new int[height * width];
|
|
tif.ReadRGBAImage(width, height, raster);
|
|
Image i = new Image(width, height);
|
|
int rgba, rasterOffset;
|
|
byte r, g, b, a;
|
|
for (uint y = 0; y < i.Height; y++)
|
|
{
|
|
rasterOffset = (int)(y * i.Width);
|
|
for (uint x = 0; x < i.Width; x++)
|
|
{
|
|
rgba = raster[rasterOffset++];
|
|
r = (byte)(rgba & 0xff);
|
|
g = (byte)((rgba >> 8) & 0xff);
|
|
b = (byte)((rgba >> 16) & 0xff);
|
|
a = (byte)((rgba >> 24) & 0xff);
|
|
i.SetPixel(x, y, new Pixel(r, g, b, a));
|
|
}
|
|
}
|
|
// Need to flip the image.
|
|
Image i2 = new Image(width, height);
|
|
uint y2 = 0;
|
|
for (uint y = (uint)(i.Height - 1); y >= 0 && y < i.Height; y--)
|
|
{
|
|
for (uint x = 0; x < i.Width; x++)
|
|
{
|
|
i2.SetPixel(x, y2, i.GetPixel(x, y));
|
|
}
|
|
y2++;
|
|
}
|
|
i.Dispose();
|
|
return i2;
|
|
}
|
|
}
|
|
}
|