Manipulando dados do Bitmap

2 respostas
U

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).

2 Respostas

caxxias

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

U
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());			 
		 }	 
	 }

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

Criado 21 de maio de 2008
Ultima resposta 21 de mai. de 2008
Respostas 2
Participantes 2