mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-05 04:25:29 -04:00
#744 TIFF: Re-complicated TIFF writing for the sake of performance...
(cherry picked from commit 76a35331b0285187663ff4e3b5750b7c093a293c)
This commit is contained in:
parent
0b23644b8d
commit
beb88e2453
@ -531,6 +531,10 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
final int sampleSize = renderedImage.getSampleModel().getSampleSize(0);
|
final int sampleSize = renderedImage.getSampleModel().getSampleSize(0);
|
||||||
final int numBands = renderedImage.getSampleModel().getNumBands();
|
final int numBands = renderedImage.getSampleModel().getNumBands();
|
||||||
|
|
||||||
|
// TODO: This buffer should probably have order matching that of imageOutput, but only if writing "actual" 16 or 32 bit samples, not "packed" samples
|
||||||
|
final byte[] buffer = new byte[(tileWidth * numBands * sampleSize + 7) / 8];
|
||||||
|
int bufferPos = 0;
|
||||||
|
|
||||||
for (int yTile = minTileY; yTile < maxYTiles; yTile++) {
|
for (int yTile = minTileY; yTile < maxYTiles; yTile++) {
|
||||||
for (int xTile = minTileX; xTile < maxXTiles; xTile++) {
|
for (int xTile = minTileX; xTile < maxXTiles; xTile++) {
|
||||||
final Raster tile = renderedImage.getTile(xTile, yTile);
|
final Raster tile = renderedImage.getTile(xTile, yTile);
|
||||||
@ -568,16 +572,17 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
for (int s = 0; s < numBands; s++) {
|
for (int s = 0; s < numBands; s++) {
|
||||||
if (sampleSize == 8 || shift == 0) {
|
if (sampleSize == 8 || shift == 0) {
|
||||||
// Normal interleaved/planar case
|
// Normal interleaved/planar case
|
||||||
stream.writeByte((byte) (dataBuffer.getElem(b, xOff + bandOffsets[s]) & 0xff));
|
buffer[bufferPos++] = ((byte) (dataBuffer.getElem(b, xOff + bandOffsets[s]) & 0xff));
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// "Packed" case
|
// "Packed" case
|
||||||
stream.writeByte((byte) (rowBuffer.getElem(b, x - offsetX + bandOffsets[s]) & 0xff));
|
buffer[bufferPos++] = ((byte) (rowBuffer.getElem(b, x - offsetX + bandOffsets[s]) & 0xff));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flushBuffer(buffer, bufferPos, stream);
|
||||||
|
bufferPos = 0;
|
||||||
flushStream(stream);
|
flushStream(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -597,9 +602,13 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
for (int x = offsetX; x < tileWidth + offsetX; x++) {
|
for (int x = offsetX; x < tileWidth + offsetX; x++) {
|
||||||
int xOff = yOff + x;
|
int xOff = yOff + x;
|
||||||
|
|
||||||
stream.writeShort((short) (dataBuffer.getElem(b, xOff) & 0xffff));
|
int elem = dataBuffer.getElem(b, xOff);
|
||||||
|
buffer[bufferPos++] = (byte) ((elem >>> 8) & 0xff);
|
||||||
|
buffer[bufferPos++] = (byte) (elem & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flushBuffer(buffer, bufferPos, stream);
|
||||||
|
bufferPos = 0;
|
||||||
flushStream(stream);
|
flushStream(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -642,9 +651,15 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
for (int x = offsetX; x < tileWidth + offsetX; x++) {
|
for (int x = offsetX; x < tileWidth + offsetX; x++) {
|
||||||
int xOff = yOff + x;
|
int xOff = yOff + x;
|
||||||
|
|
||||||
stream.writeInt(dataBuffer.getElem(b, xOff));
|
int elem = dataBuffer.getElem(b, xOff);
|
||||||
|
buffer[bufferPos++] = (byte) ((elem >>> 24) & 0xff);
|
||||||
|
buffer[bufferPos++] = (byte) ((elem >>> 16) & 0xff);
|
||||||
|
buffer[bufferPos++] = (byte) ((elem >>> 8) & 0xff);
|
||||||
|
buffer[bufferPos++] = (byte) (elem & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flushBuffer(buffer, bufferPos, stream);
|
||||||
|
bufferPos = 0;
|
||||||
flushStream(stream);
|
flushStream(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -661,10 +676,12 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
int element = dataBuffer.getElem(b, xOff);
|
int element = dataBuffer.getElem(b, xOff);
|
||||||
|
|
||||||
for (int s = 0; s < numBands; s++) {
|
for (int s = 0; s < numBands; s++) {
|
||||||
stream.writeByte((byte) ((element >> bitOffsets[s]) & 0xff));
|
buffer[bufferPos++] = (byte) ((element >> bitOffsets[s]) & 0xff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flushBuffer(buffer, bufferPos, stream);
|
||||||
|
bufferPos = 0;
|
||||||
flushStream(stream);
|
flushStream(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -690,14 +707,18 @@ public final class TIFFImageWriter extends ImageWriterBase {
|
|||||||
processImageComplete();
|
processImageComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void flushStream(DataOutput stream) throws IOException {
|
private static void flushStream(DataOutput stream) throws IOException {
|
||||||
// Need to flush/start new compression for each row, for proper LZW/PackBits/Deflate/ZLib compression
|
// Need to flush/start new compression for each row, for proper LZW/PackBits/Deflate/ZLib
|
||||||
if (stream instanceof DataOutputStream) {
|
if (stream instanceof DataOutputStream) {
|
||||||
DataOutputStream dataOutputStream = (DataOutputStream) stream;
|
DataOutputStream dataOutputStream = (DataOutputStream) stream;
|
||||||
dataOutputStream.flush();
|
dataOutputStream.flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void flushBuffer(final byte[] buffer, final int bufferPos, final DataOutput stream) throws IOException {
|
||||||
|
stream.write(buffer, 0, bufferPos);
|
||||||
|
}
|
||||||
|
|
||||||
// Metadata
|
// Metadata
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
x
Reference in New Issue
Block a user