Created
October 23, 2019 05:26
-
-
Save mcihad/60a5ed00e281db7428b6b28bce45caa8 to your computer and use it in GitHub Desktop.
Resim boyutlandırma java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javax.imageio.ImageIO; | |
import javax.swing.*; | |
import javax.swing.event.ChangeEvent; | |
import javax.swing.event.ChangeListener; | |
import javax.swing.filechooser.FileNameExtensionFilter; | |
import java.awt.*; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.awt.image.BufferedImage; | |
import java.io.File; | |
import java.io.IOException; | |
/** | |
* @author Cihad GÜNDOĞDU | |
*/ | |
class BufferedImagePanel extends JPanel { | |
private BufferedImage image; | |
public void setImage(BufferedImage image) { | |
this.image = image; | |
} | |
private BufferedImage getImage() { | |
return image; | |
} | |
@Override | |
protected void paintComponent(Graphics g) { | |
super.paintComponent(g); | |
Graphics2D graph = (Graphics2D) g; | |
if (getImage() != null) { | |
graph.drawImage(getImage(), 0, 0, null); | |
} | |
} | |
} | |
public class ResizeImageApp extends JFrame { | |
//Büyütme oran | |
private int scaleFactor = 1; | |
private File file; | |
private BufferedImagePanel imagePanel; | |
public ResizeImageApp() { | |
initUI(); | |
setSize(800, 600); | |
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
setTitle("Resim Boyutlandır"); | |
} | |
private void initUI() { | |
setLayout(new BorderLayout()); | |
JPanel toolPanel = new JPanel(); | |
toolPanel.setLayout(new FlowLayout()); | |
JSlider slider = new JSlider(); | |
slider.setMinimum(1); | |
slider.setMaximum(5); | |
slider.setValue(1); | |
slider.setEnabled(false); | |
slider.addChangeListener(new ChangeListener() { | |
@Override | |
public void stateChanged(ChangeEvent changeEvent) { | |
//scale factor değerini sliderin değeriyle eşitle | |
setScaleFactor(slider.getValue()); | |
try { | |
rescaleImage(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
}); | |
JButton selectFileButton = new JButton("Resim Seçiniz"); | |
selectFileButton.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent actionEvent) { | |
JFileChooser openDialog = new JFileChooser(); | |
//varsayılan olarak tüm dosya türlerini seçebiliriz. İptal ediyoruz bunu | |
openDialog.setAcceptAllFileFilterUsed(false); | |
//sadece jpg,jpeg uzantılı dosyaları seç | |
//PNG resimlerde Alpha kalanlı da olduğu için biraz farklı işlemek gerekiyor. Onu seçmedim hocam. | |
openDialog.addChoosableFileFilter(new FileNameExtensionFilter("Resim Dosyası", "jpg", "jpeg")); | |
int result = openDialog.showDialog(null, "Resim seç"); | |
if (result == JFileChooser.APPROVE_OPTION) { | |
slider.setEnabled(true); | |
setFile(openDialog.getSelectedFile()); | |
try { | |
rescaleImage(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
}); | |
toolPanel.add(selectFileButton); | |
toolPanel.add(slider); | |
imagePanel = new BufferedImagePanel(); | |
add(toolPanel, BorderLayout.PAGE_START); | |
add(imagePanel, BorderLayout.CENTER); | |
} | |
/** | |
* @throws IOException | |
* Boyutlandırma işlemi burada yapılıyor | |
*/ | |
private void rescaleImage() throws IOException { | |
BufferedImage resim = ImageIO.read(getFile()); | |
//scaleFactor değerine göre kaç kat büyük resim olacak | |
//Ayrıca resimde sadece RGB kanalları olacak ALPHA kanalı olmayacak | |
//Eğer ALPHA da olacaksa TYPE_INT_ARGB olacak ama resim formatı PNG olmalı | |
BufferedImage newResim = new BufferedImage(resim.getWidth() * getScaleFactor(), resim.getHeight() * getScaleFactor(), BufferedImage.TYPE_INT_RGB); | |
//satırlar ve sütünlar arasında dön | |
for (int x = 0; x < resim.getWidth(); x++) { | |
for (int y = 0; y < resim.getHeight(); y++) { | |
int color = resim.getRGB(x, y); | |
for (int i = 0; i < getScaleFactor(); i++) { | |
//scaleFactor değeri kadar ilave x eksenine aynı renkte piksel ekle | |
newResim.setRGB(x * getScaleFactor() + i, y * getScaleFactor(), color); | |
for (int j = 0; j < getScaleFactor(); j++) { | |
//x eksenine eklenen tüm piksellerin altına aynı boyutta aşağı doğru pixel ekle | |
newResim.setRGB(x * getScaleFactor() + i, y * getScaleFactor() + j, color); | |
} | |
} | |
} | |
} | |
//imaj panelin resimini değiştir veya resim ata | |
imagePanel.setImage(newResim); | |
//paneli yeniden çizeren paintComponent metodun çağır | |
imagePanel.repaint(); | |
} | |
public int getScaleFactor() { | |
return scaleFactor; | |
} | |
public void setScaleFactor(int scaleFactor) { | |
this.scaleFactor = scaleFactor; | |
} | |
public File getFile() { | |
return file; | |
} | |
public void setFile(File file) { | |
this.file = file; | |
} | |
public static void main(String[] args) { | |
EventQueue.invokeLater(() -> new ResizeImageApp().setVisible(true)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment