Manipulando dados do Bitmap

Galera, existe em java algo que me permita manipular os dados das estruturas
FileHeader e InfoHeader de imagens Bitmap??

O que preciso é gravar uma imagem BMP mas os dados da imagem vêm do BD separados (tamanho, vetor de pixels, bits per pixel, etc).

nunca precisei nada a fundo para manipulação de imagens
mas tenho uns links aqui de projetos que talvez lhe ajudem :

Java Advanced Imaging

https://jai-imageio.dev.java.net/
http://java.sun.com/products/java-media/jai/downloads/download-iio-1_0_01.html

[code]private void gravaImagem ( Object imagem, String nomeArquivo, String extensao, int numeroExtensao )
{
BufferedImage bufferRet = null;
String path = “c:\programa\”+nomeArquivo+"\Imagem\00"+nomeArquivo+"."+extensao+numeroExtensao;
File arquivo = new File (path);
//a função abaixo retorna o buffer com a imagem
byte imagemOrigem [] = clientBridge.getFrameData(1,1);
byte bufferRGB [] = null;
//img é uma Interface que uso para ler os atributos do banco.
int altura = img.getNumlin().intValue();
int largura = img.getNumcol().intValue();
int numSamples = img.getSamperpix().intValue();
int bitsAllocated = img.getBitall().intValue();

	 if (imagemOrigem != null)
	 {
       //Se o número de samples por pixel é 1, transforma a imagem em RGB repetindo os valores
		if (numSamples == 1)
		{
			int	tamBuffer = imagemOrigem.length;
			bufferRGB = new byte[largura*altura*3];
			byte[] pixelData = imagemOrigem;
			if (bitsAllocated == 8)
			{
				byte pixelValue;
				for (int i=0;i<tamBuffer;i++)
				{
					pixelValue = pixelData[i];
					
					bufferRGB[i*3] = pixelValue;
					bufferRGB[i*3+1] = pixelValue;
					bufferRGB[i*3+2] = pixelValue;
				}
			}
			else
			{
				// Se a imagem tem mais de 8 bits copia bits mais significativos
				int j = 0;
				short pixelValue;
				int max = 0;
				int min = 65535;
				
				for (int i=0;i<tamBuffer;i=i+2)
				{
					pixelValue = (short) ((pixelData[i+1] << 8) + pixelData[i]);
		            int value = pixelValue;
		            if (value<min)
		                min = value;
		            if (value>max)
		                max = value;
		        }

				double scale = 256.0/(max-min+1);

				for (int i=0;i<tamBuffer;i=i+2)
				{
					pixelValue = (short) ((pixelData[i+1] << 8) + pixelData[i]);
					// Se o pixel representation é igual a 1
					// o valor do pixel está em complemento de 2
												
	                int value = (pixelValue)-min;
	                if (value<0) 
	                	value = 0;
	                value = (int)(value*scale);
			        if (value>255) 
			        	value = 255;

					bufferRGB[j*3] = (byte) value;
					bufferRGB[j*3+1] = (byte) value;
					bufferRGB[j*3+2] = (byte) value;
					j++;
				}				
			}
		}
		else if (numSamples == 3)
			bufferRGB = imagemOrigem;
	 }
	 
    //Convertendo o pixeldata DICOM para BufferedImage
	 int[] bandOffset = { 0,1,2 };
	 DataBuffer dataBuffer = new DataBufferByte(bufferRGB,largura*altura*3);
	 WritableRaster raster = Raster.createInterleavedRaster(dataBuffer,largura,altura,largura*3,3, bandOffset, null);
	 bufferRet = new BufferedImage(largura,altura,BufferedImage.TYPE_INT_RGB);
	 bufferRet.setData(raster);		 
	 try {				
		// Escrevendo imagem no formato bmp no buffer que vai ser retornado 
		ImageIO.write(bufferRet,"bmp",arquivo);
	 } catch (IOException e) {			
		 logger.error(e.getStackTrace());			 
	 }	 
 }[/code]

Foi assim que resolvi, valeu a ajuda e espero que lhes ajude. Qualquer dúvida me perguntem.