📄 bmpimagewriter.java
字号:
r = new byte[paletteEntries]; g = new byte[paletteEntries]; b = new byte[paletteEntries]; a = new byte[paletteEntries]; icm.getAlphas(a); icm.getReds(r); icm.getGreens(g); icm.getBlues(b); } } else { // Grey scale images if (numBands == 1) { isPalette = true; paletteEntries = 256; bitsPerPixel = sampleSize[0]; destScanlineBytes = (w * bitsPerPixel + 7 >> 3); r = new byte[256]; g = new byte[256]; b = new byte[256]; a = new byte[256]; for (int i = 0; i < 256; i++) { r[i] = (byte)i; g[i] = (byte)i; b[i] = (byte)i; a[i] = (byte)255; } } else { if (sampleModel instanceof SinglePixelPackedSampleModel && noSubband) { bitsPerPixel = DataBuffer.getDataTypeSize(sampleModel.getDataType()); destScanlineBytes = w * bitsPerPixel + 7 >> 3; if (compressionType == BMPConstants.BI_BITFIELDS) { isPalette = true; paletteEntries = 3; r = new byte[paletteEntries]; g = new byte[paletteEntries]; b = new byte[paletteEntries]; a = new byte[paletteEntries]; if (bitsPerPixel == 16) { b[0]=(byte)0x00; g[0]=(byte)0x00; r[0]=(byte)0xF8; a[0]=(byte)0x00; // red mask 0x00000F800 b[1]=(byte)0x00; g[1]=(byte)0x00; r[1]=(byte)0x07; a[1]=(byte)0xE0; // green mask 0x0000007E0 b[2]=(byte)0x00; g[2]=(byte)0x00; r[2]=(byte)0x00; a[2]=(byte)0x1F; // blue mask 0x00000001F } else if (bitsPerPixel == 32) { b[0]=(byte)0x00; g[0]=(byte)0xFF; r[0]=(byte)0x00; a[0]=(byte)0x00; // red mask 0x00FF0000 b[1]=(byte)0x00; g[1]=(byte)0x00; r[1]=(byte)0xFF; a[1]=(byte)0x00; // green mask 0x0000FF00 b[2]=(byte)0x00; g[2]=(byte)0x00; r[2]=(byte)0x00; a[2]=(byte)0xFF; // blue mask 0x000000FF } else { throw new RuntimeException(I18N.getString("BMPImageWrite6")); } } } } } // actual writing of image data int fileSize = 0; int offset = 0; int headerSize = 0; int imageSize = 0; int xPelsPerMeter = 0; int yPelsPerMeter = 0; int colorsUsed = 0; int colorsImportant = paletteEntries; // Calculate padding for each scanline int padding = destScanlineBytes % 4; if (padding != 0) { padding = 4 - padding; } if (sampleModel instanceof SinglePixelPackedSampleModel && noSubband) { destScanlineBytes = w; bitPos = ((SinglePixelPackedSampleModel)sampleModel).getBitMasks(); for (int i = 0; i < bitPos.length; i++) bitPos[i] = firstLowBit(bitPos[i]); } // FileHeader is 14 bytes, BitmapHeader is 40 bytes, // add palette size and that is where the data will begin offset = 54 + paletteEntries * 4; imageSize = (destScanlineBytes + padding) * h; fileSize = imageSize + offset; headerSize = 40; long headPos = stream.getStreamPosition(); writeFileHeader(fileSize, offset); writeInfoHeader(headerSize, bitsPerPixel); // compression stream.writeInt(compressionType); // imageSize stream.writeInt(imageSize); // xPelsPerMeter stream.writeInt(xPelsPerMeter); // yPelsPerMeter stream.writeInt(yPelsPerMeter); // Colors Used stream.writeInt(colorsUsed); // Colors Important stream.writeInt(colorsImportant); // palette if (isPalette == true) { // write palette if (compressionType == BMPConstants.BI_BITFIELDS) { // write masks for red, green and blue components. for (int i=0; i<3; i++) { int mask = (a[i]&0xFF) + ((r[i]&0xFF)*0x100) + ((g[i]&0xFF)*0x10000) + ((b[i]&0xFF)*0x1000000); stream.writeInt(mask); } } else { for (int i=0; i<paletteEntries; i++) { stream.writeByte(b[i]); stream.writeByte(g[i]); stream.writeByte(r[i]); stream.writeByte(a[i]); } } } // Writing of actual image data int scanlineBytes = w * numBands; // Buffer for up to 8 rows of pixels int[] pixels = new int[scanlineBytes * scaleX]; // Also create a buffer to hold one line of the data // to be written to the file, so we can use array writes. bpixels = new byte[destScanlineBytes]; int l; if (compressionType == BMPConstants.BI_JPEG || compressionType == BMPConstants.BI_PNG) { // prepare embedded buffer embedded_stream = new ByteArrayOutputStream(); writeEmbedded(image, bmpParam); // update the file/image Size embedded_stream.flush(); imageSize = embedded_stream.size(); long endPos = stream.getStreamPosition(); fileSize = (int)(offset + imageSize); stream.seek(headPos); writeSize(fileSize, 2); stream.seek(headPos); writeSize(imageSize, 34); stream.seek(endPos); stream.write(embedded_stream.toByteArray()); embedded_stream = null; if (abortRequested()) { processWriteAborted(); } else { processImageComplete(); stream.flushBefore(stream.getStreamPosition()); } return; } isTopDown = bmpParam.isTopDown(); int maxBandOffset = bandOffsets[0]; for (int i = 1; i < bandOffsets.length; i++) if (bandOffsets[i] > maxBandOffset) maxBandOffset = bandOffsets[i]; int[] pixel = new int[maxBandOffset + 1]; for (int i = 0; i < h; i++) { if (abortRequested()) { break; } int row = minY + i; if (!isTopDown) row = minY + h - i -1; // Get the pixels Raster src = inputRaster; Rectangle srcRect = new Rectangle(minX * scaleX + xOffset, row * scaleY + yOffset, (w - 1)* scaleX + 1, 1); if (!writeRaster) src = input.getData(srcRect); if (noTransform && noSubband) { SampleModel sm = src.getSampleModel(); int pos = 0; int startX = srcRect.x - src.getSampleModelTranslateX(); int startY = srcRect.y - src.getSampleModelTranslateY(); if (sm instanceof ComponentSampleModel) { ComponentSampleModel csm = (ComponentSampleModel)sm; pos = csm.getOffset(startX, startY, 0); for(int nb=1; nb < csm.getNumBands(); nb++) { if (pos > csm.getOffset(startX, startY, nb)) { pos = csm.getOffset(startX, startY, nb); } } } else if (sm instanceof MultiPixelPackedSampleModel) { MultiPixelPackedSampleModel mppsm = (MultiPixelPackedSampleModel)sm; pos = mppsm.getOffset(startX, startY); } else if (sm instanceof SinglePixelPackedSampleModel) { SinglePixelPackedSampleModel sppsm = (SinglePixelPackedSampleModel)sm; pos = sppsm.getOffset(startX, startY); } if (compressionType == BMPConstants.BI_RGB || compressionType == BMPConstants.BI_BITFIELDS){ switch(dataType) { case DataBuffer.TYPE_BYTE: byte[] bdata = ((DataBufferByte)src.getDataBuffer()).getData(); stream.write(bdata, pos, destScanlineBytes); break; case DataBuffer.TYPE_SHORT: short[] sdata = ((DataBufferShort)src.getDataBuffer()).getData(); stream.writeShorts(sdata, pos, destScanlineBytes); break; case DataBuffer.TYPE_USHORT: short[] usdata = ((DataBufferUShort)src.getDataBuffer()).getData(); stream.writeShorts(usdata, pos, destScanlineBytes); break; case DataBuffer.TYPE_INT: int[] idata = ((DataBufferInt)src.getDataBuffer()).getData(); stream.writeInts(idata, pos, destScanlineBytes); break; } for(int k=0; k<padding; k++) { stream.writeByte(0); } } else if (compressionType == BMPConstants.BI_RLE4) { if (bpixels == null || bpixels.length < scanlineBytes) bpixels = new byte[scanlineBytes]; src.getPixels(srcRect.x, srcRect.y, srcRect.width, srcRect.height, pixels); for (int h=0; h<scanlineBytes; h++) { bpixels[h] = (byte)pixels[h]; } encodeRLE4(bpixels, scanlineBytes); } else if (compressionType == BMPConstants.BI_RLE8) { //byte[] bdata = // ((DataBufferByte)src.getDataBuffer()).getData(); //System.out.println("bdata.length="+bdata.length); //System.arraycopy(bdata, pos, bpixels, 0, scanlineBytes); if (bpixels == null || bpixels.length < scanlineBytes) bpixels = new byte[scanlineBytes]; src.getPixels(srcRect.x, srcRect.y, srcRect.width, srcRect.height, pixels); for (int h=0; h<scanlineBytes; h++) { bpixels[h] = (byte)pixels[h]; } encodeRLE8(bpixels, scanlineBytes); } } else { src.getPixels(srcRect.x, srcRect.y, srcRect.width, srcRect.height, pixels); if (scaleX != 1 || maxBandOffset != numBands -1 || bgrOrder) for (int j = 0, k = 0, n=0; j < w; j++, k += scaleX * numBands, n += numBands) { System.arraycopy(pixels, k, pixel, 0, pixel.length); for (int m = 0; m < numBands; m++) pixels[n + numBands - m - 1] = pixel[bandOffsets[sourceBands[m]]]; } writePixels(0, scanlineBytes, bitsPerPixel, pixels, padding, numBands, icm); } processImageProgress(100.0f * (((float)i) / ((float)h))); } if (compressionType == BMPConstants.BI_RLE4 || compressionType == BMPConstants.BI_RLE8) { // Write the RLE EOF marker and stream.writeByte(0); stream.writeByte(1); incCompImageSize(2); // update the file/image Size imageSize = compImageSize; fileSize = compImageSize + offset; long endPos = stream.getStreamPosition(); stream.seek(headPos); writeSize(fileSize, 2); stream.seek(headPos); writeSize(imageSize, 34); stream.seek(endPos); } if (abortRequested()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -