public static void CompressLZW(Stream stream, int predictor, byte[] b, int height, int samplesPerPixel, int stride) {
LZWCompressor lzwCompressor = new LZWCompressor(stream, 8, true);
bool usePredictor = predictor == TIFFConstants.PREDICTOR_HORIZONTAL_DIFFERENCING;
if (!usePredictor) {
lzwCompressor.Compress(b, 0, b.Length);
} else {
int off = 0;
byte[] rowBuf = usePredictor ? new byte[stride] : null;
for (int i = 0; i < height; i++) {
System.Array.Copy(b, off, rowBuf, 0, stride);
for (int j = stride - 1; j >= samplesPerPixel; j--) {
rowBuf[j] -= rowBuf[j - samplesPerPixel];
}
lzwCompressor.Compress(rowBuf, 0, stride);
off += stride;
}
}
lzwCompressor.Flush();
}
}