Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 压缩后显示图像_Java_Image Processing_Compression - Fatal编程技术网

Java 压缩后显示图像

Java 压缩后显示图像,java,image-processing,compression,Java,Image Processing,Compression,在我的代码中,我提供了一个输入图像并将其转换为字符串。字符串被压缩和解压缩。解压缩后,字符串被转换为图像并显示。这里的问题是,我需要在压缩后显示图像。我已经为此编写了代码。但它通过告诉“不是jpeg文件”来显示错误消息 我的代码: ImageEncode.java public class ImageEncode { public ImageEncode() throws Exception { try { File imageFile = ne

在我的代码中,我提供了一个输入图像并将其转换为字符串。字符串被压缩和解压缩。解压缩后,字符串被转换为图像并显示。这里的问题是,我需要在压缩后显示图像。我已经为此编写了代码。但它通过告诉“不是jpeg文件”来显示错误消息

我的代码:

ImageEncode.java

public class ImageEncode {

    public ImageEncode() throws Exception {
        try {
            File imageFile = new File("C:\\Users\\user\\Desktop\\encryption\\original.jpg");
            String img = imageToBase64String(imageFile);

            System.out.println("Converted String " + img);
            //Compression
            byte[] compressed = compress(img);
            String dd = MyBase64.encode(compressed);

            ByteArrayInputStream bis1 = new ByteArrayInputStream(compressed);
            Iterator<?> readers1 = ImageIO.getImageReadersByFormatName("jpg");

            //ImageIO is a class containing static methods for locating ImageReaders
            //and ImageWriters, and performing simple encoding and decoding. 

            ImageReader reader1 = (ImageReader) readers1.next();
            Object source1 = bis1;
            ImageInputStream iis1 = ImageIO.createImageInputStream(source1);
            reader1.setInput(iis1, true);
            ImageReadParam param1 = reader1.getDefaultReadParam();

            Image image11 = reader1.read(0, param1);
            //got an image file

            BufferedImage bufferedImage1 = new BufferedImage(image11.getWidth(null), image11.getHeight(null), BufferedImage.TYPE_INT_RGB);
            //bufferedImage is the RenderedImage to be written

            Graphics2D g21 = bufferedImage1.createGraphics();
            g21.drawImage(image11, null, null);

            File imageFile11 = new File("C:\\Users\\user\\Desktop\\encryption\\compress.jpg");
            ImageIO.write(bufferedImage1, "jpg", imageFile11);

            //Decompression
            String dcr = decompress(compressed);

            System.out.println("Converted String1 " + dcr);
            byte[] d = MyBase64.decode(dcr);

            ByteArrayInputStream bis = new ByteArrayInputStream(d);
            Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");

            //ImageIO is a class containing static methods for locating ImageReaders
            //and ImageWriters, and performing simple encoding and decoding. 

            ImageReader reader = (ImageReader) readers.next();
            Object source = bis;
            ImageInputStream iis = ImageIO.createImageInputStream(source);
            reader.setInput(iis, true);
            ImageReadParam param = reader.getDefaultReadParam();

            Image image1 = reader.read(0, param);
            //got an image file

            BufferedImage bufferedImage = new BufferedImage(image1.getWidth(null), image1.getHeight(null), BufferedImage.TYPE_INT_RGB);
            //bufferedImage is the RenderedImage to be written

            Graphics2D g2 = bufferedImage.createGraphics();
            g2.drawImage(image1, null, null);

            File imageFile1 = new File("C:\\Users\\user\\Desktop\\encryption\\decompress.jpg");
            ImageIO.write(bufferedImage, "jpg", imageFile1);
            System.out.println(imageFile1.getPath());
        } catch (IOException ex) {
            Logger.getLogger(ImageEncode.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) throws Exception {
        new ImageEncode();

    }//main(-)

    public static String imageToBase64String(File imageFile) throws Exception {

        String image = null;
        BufferedImage buffImage = ImageIO.read(imageFile);

        if (buffImage != null) {
            java.io.ByteArrayOutputStream os = new java.io.ByteArrayOutputStream();
            ImageIO.write(buffImage, "jpg", os);
            byte[] data = os.toByteArray();
            image = MyBase64.encode(data);

        }
        return image;
    }

    public static byte[] compress(String str) throws Exception {
        System.out.println("String length : " + str.length());
        ByteArrayOutputStream obj = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();
        return obj.toByteArray();
    }

    public static String decompress(byte[] bytes) throws Exception {
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
        BufferedReader bf = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
        String outStr = "";
        String line;
        while ((line = bf.readLine()) != null) {
            outStr += line;
        }
        System.out.println("Output String lenght : " + outStr.length());
        return outStr;
    }
}//class
公共类ImageEncode{
public ImageEncode()引发异常{
试一试{
File imageFile=新文件(“C:\\Users\\user\\Desktop\\encryption\\original.jpg”);
字符串img=ImageToBase64字符串(imageFile);
System.out.println(“转换字符串”+img);
//压缩
字节[]压缩=压缩(img);
字符串dd=MyBase64.encode(压缩);
ByteArrayInputStream bis1=新的ByteArrayInputStream(压缩);
迭代器readers1=ImageIO.getImageReadersByFormatName(“jpg”);
//ImageIO是一个包含用于定位ImageReaders的静态方法的类
//和图像编写器,并执行简单的编码和解码。
ImageReader reader1=(ImageReader)reader1.next();
objectsource1=bis1;
ImageInputStream iis1=ImageIO.CreateMageInputStream(source1);
reader1.setInput(iis1,真);
ImageReadParam param1=reader1.getDefaultReadParam();
Image image11=reader1.read(0,参数1);
//有图像文件吗
BuffereImage BuffereImage 1=新的BuffereImage(image11.getWidth(null)、image11.getHeight(null)、BuffereImage.TYPE_INT_RGB);
//BuffereImage是要写入的渲染图像
Graphics2D g21=bufferedImage1.createGraphics();
g21.drawImage(image11,null,null);
File imageFile11=新文件(“C:\\Users\\user\\Desktop\\encryption\\compress.jpg”);
写入(bufferedImage1,“jpg”,imageFile11);
//减压
字符串dcr=解压缩(压缩);
系统输出打印项次(“转换的字符串1”+dcr);
字节[]d=MyBase64.解码(dcr);
ByteArrayInputStream bis=新的ByteArrayInputStream(d);
迭代器阅读器=ImageIO.getImageReadersByFormatName(“jpg”);
//ImageIO是一个包含用于定位ImageReaders的静态方法的类
//和图像编写器,并执行简单的编码和解码。
ImageReader=(ImageReader)readers.next();
对象源=bis;
ImageInputStream iis=ImageIO.createImageInputStream(源);
reader.setInput(iis,true);
ImageReadParam param=reader.getDefaultReadParam();
Image image1=reader.read(0,参数);
//有图像文件吗
BuffereImage BuffereImage=新的BuffereImage(image1.getWidth(null)、image1.getHeight(null)、BuffereImage.TYPE_INT_RGB);
//BuffereImage是要写入的渲染图像
Graphics2D g2=buffereImage.createGraphics();
g2.drawImage(image1,null,null);
File imageFile1=新文件(“C:\\Users\\user\\Desktop\\encryption\\decompress.jpg”);
写入(bufferedImage,“jpg”,imageFile1);
System.out.println(imageFile1.getPath());
}捕获(IOEX异常){
Logger.getLogger(ImageEncode.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共静态void main(字符串[]args)引发异常{
新的ImageEncode();
}//主(-)
公共静态字符串imageToBase64String(文件imageFile)引发异常{
字符串image=null;
BuffereImage buffImage=ImageIO.read(imageFile);
if(buffImage!=null){
java.io.ByteArrayOutputStream os=new java.io.ByteArrayOutputStream();
写入(buffImage,“jpg”,os);
字节[]数据=os.toByteArray();
image=MyBase64.encode(数据);
}
返回图像;
}
公共静态字节[]压缩(字符串str)引发异常{
System.out.println(“字符串长度:+str.length());
ByteArrayOutputStream obj=新建ByteArrayOutputStream();
GZIPOutputStream gzip=新的GZIPOutputStream(obj);
写入(str.getBytes(“UTF-8”);
gzip.close();
返回obj.toByteArray();
}
公共静态字符串解压缩(字节[]字节)引发异常{
GZIPInputStream gis=新的GZIPInputStream(新的ByteArrayInputStream(字节));
BufferedReader bf=新的BufferedReader(新的InputStreamReader(gis,“UTF-8”));
字符串outsr=“”;
弦线;
而((line=bf.readLine())!=null){
outStr+=线路;
}
System.out.println(“输出字符串长度:+outtr.length());
回报率;
}
}//阶级
MyBase64.java

public class MyBase64 {

private final static char[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
private static int[]  toInt   = new int[128];

static {
 for(int i=0; i< ALPHABET.length; i++){
 toInt[ALPHABET[i]]= i;
 }
}

public static String encode(byte[] buf){
  int size = buf.length;
  char[] ar = new char[((size + 2) / 3) * 4];
  int a = 0;
  int i=0;
       while(i < size){
           byte b0 = buf[i++];
           byte b1 = (i < size) ? buf[i++] : 0;
           byte b2 = (i < size) ? buf[i++] : 0;

           int mask = 0x3F;
           ar[a++] = ALPHABET[(b0 >> 2) & mask];
           ar[a++] = ALPHABET[((b0 << 4) | ((b1 & 0xFF) >> 4)) & mask];
           ar[a++] = ALPHABET[((b1 << 2) | ((b2 & 0xFF) >> 6)) & mask];
           ar[a++] = ALPHABET[b2 & mask];
       }//while

       switch(size % 3){
          case 1: ar[--a]  = '=';
          case 2: ar[--a]  = '=';
       }//switch
    return new String(ar);
 }

/**
 * Translates the specified Base64 string into a byte array.
 *
 * @param s the Base64 string (not null)
 * @return the byte array (not null)
 */
 public static byte[] decode(String s){
 int delta = s.endsWith( "==" ) ? 2 : s.endsWith( "=" ) ? 1 : 0;
 byte[] buffer = new byte[s.length()*3/4 - delta];
 int mask = 0xFF;
 int index = 0;

 for(int i=0; i< s.length(); i+=4){
      int c0 = toInt[s.charAt( i )];
      int c1 = toInt[s.charAt( i + 1)];
      buffer[index++]= (byte)(((c0 << 2) | (c1 >> 4)) & mask);

 if(index >= buffer.length){
   return buffer;
 }//if

   int c2 = toInt[s.charAt( i + 2)];
   buffer[index++]= (byte)(((c1 << 4) | (c2 >> 2)) & mask);

 if(index >= buffer.length){
     return buffer;
 }//if

   int c3 = toInt[s.charAt( i + 3 )];
   buffer[index++]= (byte)(((c2 << 6) | c3) & mask);
   }//for
   return buffer;
  }

}
公共类MyBase64{
私有最终静态字符[]ALPHABET=“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz012456789+/”。tocharray();
私有静态int[]toInt=new int[128];
静止的{
for(int i=0;i>2)和掩码];
ar[a++]=字母表[(b0>4))&掩码];
ar[a++]=字母表[(b1>6))&掩码];
ar[a++]=字母表[b2和掩码];
}//当
交换机(大小%3){
案例1:ar[--a]='=';
案例2:ar[--a]='=';
}//开关
返回新字符串(ar);
}
/**
*将指定的Base64字符串转换为字节数组。
*
*@param s Base64字符串(非空)
*@返回字节
SEVERE: null
javax.imageio.IIOException: Not a JPEG file: starts with 0x1f 0x8b
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:604)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:342)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:476)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:597)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1054)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1034)
    at Process.ImageEncode.<init>(ImageEncode.java:54)
    at Process.ImageEncode.main(ImageEncode.java:102)