Переупаковка TIFF с использованием LibTiff.Net в Silverlight
Все, что мне нужно, это взять TIFF-файл, открыть его и скопировать в новый файл, используя сжатие G4.
Итак, я взял утилиту LibTiff.Net и TiffCP. Сделал все возможное, чтобы преобразовать код из TIffCP и вот функция, которую я имею:
public static byte[] ConvertToG4Tiff(byte[] input)
{
var c = new Copier();
// Set compression to g4
if (!c.ProcessCompressOptions("g4")) return null;
// Open output tiff
var memoryStream = new MemoryStream();
var tiffStream = new TiffStream();
using (var outImage = Tiff.ClientOpen(string.Empty, "w", memoryStream, tiffStream))
{
using (var inImage = Tiff.ClientOpen(string.Empty, "read", new MemoryStream(input), new TiffStream()))
{
if (inImage == null) return null;
int totalPages = inImage.NumberOfDirectories();
for (var i = 0; i < totalPages;)
{
c.m_config = PlanarConfig.UNKNOWN;
c.m_compression = c.m_defcompression;
c.m_predictor = c.m_defpredictor;
c.m_fillorder = 0;
c.m_rowsperstrip = 0;
c.m_tilewidth = -1;
c.m_tilelength = -1;
c.m_g3opts = c.m_defg3opts;
if (!inImage.SetDirectory((short)i)) return null;
if (!c.Copy(inImage, outImage) || !outImage.WriteDirectory()) return null;
i++;
}
}
var retVal = new byte[tiffStream.Size(memoryStream)];
tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
return retVal;
}
}
Я думаю, что последние 3 строки, где я запутался. Я получаю верный байтовый массив (есть данные, и это около 10% от исходного несжатого TIFF)
Когда я снова пытаюсь открыть его с помощью кода - он не открывается. Передача этого нового массива через эту же функцию не будет работать. Открытый объект имеет значение NULL.
Что я сделал не так?
1 ответ
Вы должны использовать memoryStream
восстановить сжатые данные. Не использовать tiffStream
для чего-либо в коде, подобном этому.
Итак
var retVal = new byte[tiffStream.Size(memoryStream)];
tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
return retVal;
вероятно, следует изменить на
var retVal = memoryStream.ToArray();
return retVal;
Также обратите внимание, что ваш код не будет преобразовывать данные, поэтому, если входные байты не являются растровыми в 1 бит на пиксель, код потерпит неудачу.
Непонятно, зачем вам передавать сжатые данные в один и тот же код.