Added unpacking of 32-bit images appeared in some new official WFs
parent
4ad3537a26
commit
9c028a9c07
|
@ -31,7 +31,17 @@ namespace Resources.Image
|
||||||
throw new InvalidResourceException("Image signature doesn't match.");
|
throw new InvalidResourceException("Image signature doesn't match.");
|
||||||
|
|
||||||
ReadHeader();
|
ReadHeader();
|
||||||
|
if (_paletteColors > 256)
|
||||||
|
throw new InvalidResourceException(
|
||||||
|
"Too many palette colors.");
|
||||||
|
|
||||||
|
if (_paletteColors > 0)
|
||||||
ReadPalette();
|
ReadPalette();
|
||||||
|
else if (_bitsPerPixel == 8 || _bitsPerPixel == 16 || _bitsPerPixel == 24 || _bitsPerPixel == 32)
|
||||||
|
Logger.Trace("The image doesn't use a palette.");
|
||||||
|
else
|
||||||
|
throw new InvalidResourceException(
|
||||||
|
"The image format is not supported. Please report the issue on https://bitbucket.org/valeronm/amazfitbiptools");
|
||||||
return ReadImage();
|
return ReadImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +75,6 @@ namespace Resources.Image
|
||||||
if (padding != 0) Logger.Warn("Palette item {0} last byte is not zero: {1:X2}", i, padding);
|
if (padding != 0) Logger.Warn("Palette item {0} last byte is not zero: {1:X2}", i, padding);
|
||||||
|
|
||||||
var isColorValid = (r == 0 || r == 0xff) && (g == 0 || g == 0xff) && (b == 0 || b == 0xff);
|
var isColorValid = (r == 0 || r == 0xff) && (g == 0 || g == 0xff) && (b == 0 || b == 0xff);
|
||||||
|
|
||||||
if (isColorValid)
|
if (isColorValid)
|
||||||
Logger.Trace("Palette item {0}: R {1:X2}, G {2:X2}, B {3:X2}", i, r, g, b);
|
Logger.Trace("Palette item {0}: R {1:X2}, G {2:X2}, B {3:X2}", i, r, g, b);
|
||||||
else
|
else
|
||||||
|
@ -77,6 +86,16 @@ namespace Resources.Image
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap ReadImage()
|
private Bitmap ReadImage()
|
||||||
|
{
|
||||||
|
if (_paletteColors > 0) return ReadPaletteImage();
|
||||||
|
if (_bitsPerPixel == 8) return Read8BitImage();
|
||||||
|
if (_bitsPerPixel == 16) return Read16BitImage();
|
||||||
|
if (_bitsPerPixel == 24) return Read24BitImage();
|
||||||
|
if (_bitsPerPixel == 32) return Read32BitImage();
|
||||||
|
throw new InvalidResourceException($"Unsupported bits per pixel value: {_bitsPerPixel}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap ReadPaletteImage()
|
||||||
{
|
{
|
||||||
var image = new Bitmap(_width, _height);
|
var image = new Bitmap(_width, _height);
|
||||||
using (var context = image.CreateUnsafeContext())
|
using (var context = image.CreateUnsafeContext())
|
||||||
|
@ -96,5 +115,97 @@ namespace Resources.Image
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Bitmap Read8BitImage()
|
||||||
|
{
|
||||||
|
var image = new Bitmap(_width, _height);
|
||||||
|
using (var context = image.CreateUnsafeContext())
|
||||||
|
{
|
||||||
|
for (var y = 0; y < _height; y++)
|
||||||
|
{
|
||||||
|
var rowBytes = _reader.ReadBytes(_rowLengthInBytes);
|
||||||
|
for (var x = 0; x < _width; x++)
|
||||||
|
{
|
||||||
|
var data = rowBytes[x];
|
||||||
|
var color = Color.FromArgb(0xff, data, data, data);
|
||||||
|
context.SetPixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap Read16BitImage()
|
||||||
|
{
|
||||||
|
var image = new Bitmap(_width, _height);
|
||||||
|
using (var context = image.CreateUnsafeContext())
|
||||||
|
{
|
||||||
|
for (var y = 0; y < _height; y++)
|
||||||
|
{
|
||||||
|
var rowBytes = _reader.ReadBytes(_rowLengthInBytes);
|
||||||
|
var bitReader = new BitReader(rowBytes);
|
||||||
|
for (var x = 0; x < _width; x++)
|
||||||
|
{
|
||||||
|
var firstByte = (int)bitReader.ReadByte();
|
||||||
|
var secondByte = (int)bitReader.ReadByte();
|
||||||
|
var b = (byte)((secondByte >> 3) & 0x1f) << 3;
|
||||||
|
var g = (byte)(((firstByte >> 5) & 0x7) | ((secondByte & 0x07) << 3)) << 2;
|
||||||
|
var r = (byte)(firstByte & 0x1f) << 3;
|
||||||
|
var color = Color.FromArgb(0xff, r, g, b);
|
||||||
|
context.SetPixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap Read24BitImage()
|
||||||
|
{
|
||||||
|
var image = new Bitmap(_width, _height);
|
||||||
|
using (var context = image.CreateUnsafeContext())
|
||||||
|
{
|
||||||
|
for (var y = 0; y < _height; y++)
|
||||||
|
{
|
||||||
|
var rowBytes = _reader.ReadBytes(_rowLengthInBytes);
|
||||||
|
var bitReader = new BitReader(rowBytes);
|
||||||
|
for (var x = 0; x < _width; x++)
|
||||||
|
{
|
||||||
|
var alpha = (int)bitReader.ReadByte();
|
||||||
|
var b = (int)(bitReader.ReadBits(5) << 3);
|
||||||
|
var g = (int)(bitReader.ReadBits(6) << 2);
|
||||||
|
var r = (int)(bitReader.ReadBits(5) << 3);
|
||||||
|
var color = Color.FromArgb(0xff - alpha, r, g, b);
|
||||||
|
context.SetPixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap Read32BitImage()
|
||||||
|
{
|
||||||
|
var image = new Bitmap(_width, _height);
|
||||||
|
using (var context = image.CreateUnsafeContext())
|
||||||
|
{
|
||||||
|
for (var y = 0; y < _height; y++)
|
||||||
|
{
|
||||||
|
var rowBytes = _reader.ReadBytes(_rowLengthInBytes);
|
||||||
|
for (var x = 0; x < _width; x++)
|
||||||
|
{
|
||||||
|
var r = rowBytes[x * 4];
|
||||||
|
var g = rowBytes[x * 4 + 1];
|
||||||
|
var b = rowBytes[x * 4 + 2];
|
||||||
|
var alpha = rowBytes[x * 4 + 3];
|
||||||
|
var color = Color.FromArgb(0xff - alpha, r, g, b);
|
||||||
|
context.SetPixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue