2017-09-29 4 views
0

J'ai une image en niveaux de gris avec la dimension 256 * 256.J'essaie de la redimensionner à 128 * 128. Je prends en moyenne deux pixels et je l'écris dans le fichier de sortie.Impossible de redimensionner l'échelle de gris image

class Start { 

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

File input= new File("E:\\input.raw"); 

File output= new File("E:\\output.raw"); 
new Start().resizeImage(input,output,2); 

} 



public void resizeImage(File input, File output, int downScaleFactor) throws IOException { 
      byte[] fileContent= Files.readAllBytes(input.toPath()); 
      FileOutputStream stream= new FileOutputStream(output); 
      int i=0; 
      int j=1; 
      int result=0; 
      for(;i<fileContent.length;i++) 
      { 
       if(j>1){ 
        // skip the records. 
        j--; 
        continue; 
       } 
       else { 
        result = fileContent[i]; 
        for (; j < downScaleFactor; j++) { 
         result = ((result + fileContent[i + j])/2); 
        } 
        j++; 
        stream.write(fileContent[i]); 
       } 
      } 
     stream.close(); 
     } 

} 

Au-dessus de l'exécution de code avec succès, je peux voir la taille de la taille du fichier de sortie est diminué, mais lorsque je tente de convertir fichier de sortie (fichier brut) en jpg en ligne (https://www.iloveimg.com/convert-to-jpg/raw-to-jpg), il me donne une erreur disant que le fichier est corrompu. J'ai converti le fichier d'entrée du même outil en ligne, il fonctionne parfaitement. Quelque chose ne va pas avec mon code qui crée un fichier corrompu. Comment puis-je le corriger?

P.S Je ne peux pas utiliser une bibliothèque qui réduit directement une image.

+1

Je recommande d'avoir un regard sur [cette question] (https://stackoverflow.com/questions/14115950/quality-of-image- after-resize-very-low-java) pour une discussion sur la réduction d'échelle des images et le maintien de la qualité. Parce que la réponse d'acceptation utilise une bibliothèque tierce, je vous recommande également de jeter un coup d'œil à [cette réponse] (https://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background- image/11959928 # 11959928) qui discute en utilisant une approche de diviser pour régner à l'échelle des images en utilisant la fonctionnalité de bibliothèque trouvée dans Java lui-même – MadProgrammer

+0

L'outil en ligne que vous liez convertit ["Camera RAW"] (https://en.wikipedia.org/ wiki/Raw_image_format) en JPEG. Ces types de fichiers ne sont pas des données de pixels "brutes", ils se conforment à un format de fichier (généralement basé sur TIFF/Exif), contiennent plusieurs images dans différentes compression/résolutions, vignettes etc. avec les données de capteur "brutes" (typiquement JPEG sans perte compressé). Votre code suppose que le fichier contient des données de pixels brutes et corrompt les fichiers RAW de la caméra dans le processus. Voir [cette réponse] (https://stackoverflow.com/q/1222324/1428606) pour une entrée sur la façon de les lire ... – haraldK

Répondre

0

Votre code ne gère pas le redimensionnement de l'image.

Voir how-to-resize-images-in-java.

Ce qui, je copie une version simple ici:

import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class ImageResizer { 

    public static void resize(String inputImagePath, 
      String outputImagePath, int scaledWidth, int scaledHeight) 
      throws IOException { 
     // reads input image 
     File inputFile = new File(inputImagePath); 
     BufferedImage inputImage = ImageIO.read(inputFile); 

     // creates output image 
     BufferedImage outputImage = new BufferedImage(scaledWidth, 
       scaledHeight, inputImage.getType()); 

     // scales the input image to the output image 
     Graphics2D g2d = outputImage.createGraphics(); 
     g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null); 
     g2d.dispose(); 

     // extracts extension of output file 
     String formatName = outputImagePath.substring(outputImagePath 
       .lastIndexOf(".") + 1); 

     // writes to output file 
     ImageIO.write(outputImage, formatName, new File(outputImagePath)); 
    } 

    public static void resize(String inputImagePath, 
      String outputImagePath, double percent) throws IOException { 
     File inputFile = new File(inputImagePath); 
     BufferedImage inputImage = ImageIO.read(inputFile); 
     int scaledWidth = (int) (inputImage.getWidth() * percent); 
     int scaledHeight = (int) (inputImage.getHeight() * percent); 
     resize(inputImagePath, outputImagePath, scaledWidth, scaledHeight); 
    } 

    public static void main(String[] args) { 
     String inputImagePath = "resources/snoopy.jpg"; 
     String outputImagePath1 = "target/Puppy_Fixed.jpg"; 
     String outputImagePath2 = "target/Puppy_Smaller.jpg"; 
     String outputImagePath3 = "target/Puppy_Bigger.jpg"; 

     try { 
      // resize to a fixed width (not proportional) 
      int scaledWidth = 1024; 
      int scaledHeight = 768; 
      ImageResizer.resize(inputImagePath, outputImagePath1, scaledWidth, scaledHeight); 

      // resize smaller by 50% 
      double percent = 0.5; 
      ImageResizer.resize(inputImagePath, outputImagePath2, percent); 

      // resize bigger by 50% 
      percent = 1.5; 
      ImageResizer.resize(inputImagePath, outputImagePath3, percent); 

     } catch (IOException ex) { 
      System.out.println("Error resizing the image."); 
      ex.printStackTrace(); 
     } 
    } 

} 
+1

La mise à l'échelle de Java est notoirement de faible qualité, ce qui peut être amélioré en utilisant une approche de division et de conquête, démontré [ici] (https://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background-image/11959928#11959928) – MadProgrammer