用Java将像素数据转换回图像

时间:2016-07-06 05:50:11

标签: java image image-processing

我有一个将图像放在像素矩阵中的代码。我必须将这个图像分成四个部分,并为这些部分获得4个不同的图像文件。 然后我必须对其进行一些图像处理,然后将这些部分重新组合在一起。 请帮助我实现这一目标。 注意:图像是彩色的,我们只想将它分成4个相等的部分,然后将其作为一个部分取回。无需更改。这是获得四个强度矩阵的代码。但我不知道该怎么做做它。可能根本不需要它。

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

    class Optimization
{
    public static void main(String[] args) throws IOException 
   {

      BufferedImage hugeImage = ImageIO.read(new File("comp.jpg"));
        final byte[] pixels = ((DataBufferByte) hugeImage.getRaster().getDataBuffer()).getData();
     int width = hugeImage.getWidth();
     int height = hugeImage.getHeight();
      if(width%2!=0)
          width=width-1;
      if(height%2!=0)
         height=height-1;
      //System.out.print(width+" "+height);
     int intensity[][]=new int[width][height];
     int b1[][]=new int[width/2][height/2];
     int b2[][]=new int[width/2][height/2];
     int b3[][]=new int[width/2][height/2];
     int b4[][]=new int[width/2][height/2];
     int x1=0,y1=0,x2=0,y2=0,x3=0,x4=0,y3=0,y4=0;
      final int pixelLength = 3;
         for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) 
            {
            int a1,a2,a3;
           a3= ((int) pixels[pixel] & 0xff); // blue
           a2= (((int) pixels[pixel + 1] & 0xff)); // green
           a1= (((int) pixels[pixel + 2] & 0xff)); // red
            int i=(a1+a2+a3)/3;
            intensity[col][row]=i;
            if((col<=width/2-1)&&(row<=height/2-1))
            {
                b1[x1][y1]=i;
                x1++;
                if(col==width/2-1)
                {
                    x1=0;
                    y1++;
                }
            }
            if((col<width)&&(row<=height/2-1)&&(col>width/2-1))
            {
                b2[x2][y2]=i;
                x2++;
                if(col==width-1)
                {
                    x2=0;
                    y2++;
                }
            }
            if((col<width/2)&&(row<height)&&(row>=height/2))
            {
                b3[x3][y3]=i;
                x3++;
                if(col==width/2-1)
                {
                    x3=0;
                    y3++;
                }
            }
            if((col>width/2-1)&&(row>height/2-1))
            {
                b4[x4][y4]=i;
                x4++;
                if(col==width-1)
                {
                    x4=0;
                    y4++;
                }
            }
            col++;
            if (col == width)
            {
               col = 0;
               row++;   

            }

    }
     for(int m=0;m<height/2;m++)
     {
         for(int n=0;n<width/2;n++)
         {
             System.out.print(b1[n][m]+" ");
         }
         System.out.println();
     }



   }
 }

2 个答案:

答案 0 :(得分:0)

java.awt.Image为您提供getSubimage(int x, int y, int w, int h)

“返回由指定矩形区域定义的子图像。”你只需返回四个相等的区域即可。

答案 1 :(得分:0)

您可以使用getSubImage(int x, int y, int w, int h),但您将获得与原始图像共享相同栅格的图像,这意味着如果您修改新的子图像,则还可以修改原始图像。如果它对您没有问题,那就使用它。

否则,因为您已经访问过DataBuffer(好主意),这里有一个简单的代码可以执行您想要的操作(我只需创建DataBuffer副本,并且当图像尺寸为奇数时它可以工作):

BufferedImage image = ... ;
BufferedImage q1 = new BufferedImage(image.getWidth()/2, image.getHeight()/2, image.getType()) ;
BufferedImage q2 = new BufferedImage(image.getWidth()-image.getWidth()/2, image.getHeight()/2, image.getType()) ;
BufferedImage q3 = new BufferedImage(image.getWidth()/2, image.getHeight()-image.getHeight()/2, image.getType()) ;
BufferedImage q4 = new BufferedImage(image.getWidth()-image.getWidth()/2, image.getHeight()-image.getHeight()/2, image.getType()) ;
byte[] bb = ((DataBufferByte)image.getRaster().getDataBuffer()).getData() ;
byte[] bbq1 = ((DataBufferByte)q1.getRaster().getDataBuffer()).getData() ;
byte[] bbq2 = ((DataBufferByte)q2.getRaster().getDataBuffer()).getData() ;
byte[] bbq3 = ((DataBufferByte)q3.getRaster().getDataBuffer()).getData() ;
byte[] bbq4 = ((DataBufferByte)q4.getRaster().getDataBuffer()).getData() ;

for (int y=0 ; y < q1.getHeight() ; y++) // Fill Q1 and Q2
    {
    System.arraycopy(bb, y*image.getWidth(), bbq1, y*q1.getWidth(), q1.getWidth()) ;
    System.arraycopy(bb, y*image.getWidth()+q1.getWidth(), bbq2, y*q2.getWidth(), q2.getWidth()) ;
    }

for (int y=0 ; y < q3.getHeight() ; y++) // Fill Q3 and Q4
    {
    System.arraycopy(bb, (y+q1.getHeight())*image.getWidth(), bbq3, y*q3.getWidth(), q3.getWidth()) ;
    System.arraycopy(bb, (y+q1.getHeight())*image.getWidth()+q3.getWidth(), bbq4, y*q4.getWidth(), q4.getWidth()) ;
    }