Java放縮
上述問題看樣是做J2SE桌面開發的
import javax.swing.*;
import javax.awt.*;
1.請使用jtable
2.可以使用畫布,也可以使用jpanel,使用後請調用repaint()方法刷新窗體,或者使用setVisible(false)然後再setVisible(true)
3.使用多線程,一個顯示splash,另一個控製程序啟動,當程序啟動完畢後,動態通知splash關閉
4.建議定義類,存儲表達式,並提供表達式解析和數據提取
5.可以自己創建一個組件,繼承JFrame,自己添加任意組件,調用時設定該窗體為模態窗體就行了setModal(true)就可以向JOptionPane對話框一樣使用了
B. Bitmap使用詳解
用到的圖片不僅僅包括.png、.gif、.9.png、.jpg和各種Drawable系對象,還包括點陣圖Bitmap
圖片的處理也經常是影響著一個程序的高效性和健壯性。
為什麼不直接用Bitmap傳輸?
點陣圖文件雖好,但是非壓縮格式,佔用較大存儲空間。
Bitmap主要方法有:獲取圖像寬高、釋放,判斷是否已釋放和是否可修改,壓縮、創建制定點陣圖等功能
用於從不同的數據源(如文件、輸入流、資源文件、位元組數組、文件描述符等)解析、創建Bitmap對象
允許我們定義圖片以何種方式如何讀到內存。
推薦閱讀: Android - Bitmap-內存分析
注意事項:
decodeFileDescriptor比decodeFile高效
查看源碼可以知道
替換成
建議採用decodeStream代替decodeResource。
因為BitmapFactory.decodeResource 載入的圖片可能會經過縮放,該縮放目前是放在 java 層做的,效率比較低,而且需要消耗 java 層的內存。因此,如果大量使用該介面載入圖片,容易導致OOM錯誤,BitmapFactory.decodeStream 不會對所載入的圖片進行縮放,相比之下佔用內存少,效率更高。
這兩個介面各有用處,如果對性能要求較高,則應該使用 decodeStream;如果對性能要求不高,且需要 Android 自帶的圖片自適應縮放功能,則可以使用 decodeResource。
推薦閱讀:[ BitmapFactory.decodeResource載入圖片縮小的原因及解決方法
canvas和Matrix可對Bitmap進行旋轉、放縮、平移、切錯等操作
可以用Bitmap.onCreateBitmap、Canvas的clipRect和clipPath等等方式
推薦閱讀: android自定義View學習4--圖像剪切與變換
對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲。如果發生了OutOfMemory異常,應用不會崩潰,而是得到了一個默認的Bitmap圖。
如果不進行緩存,盡管看到的是同一張圖片文件,但是使用BitmapFactory類的方法來實例化出來的Bitmap,是不同的Bitmap對象。緩存可以避免新建多個Bitmap對象,避免內存的浪費。
如果圖片像素過大,使用BitmapFactory類的方法實例化Bitmap的過程中,需要大於8M的內存空間,就必定會發生OutOfMemory異常。
可以將圖片縮小,以減少載入圖片過程中的內存的使用,避免異常發生。
推薦閱讀:
Bitmap詳解與Bitmap的內存優化
C. JAVA 3D已啟動小程序 但是一片空白怎麼辦代碼如下:
看看後台有什麼錯誤信息。。。。。沒有附件,也測試不了。
異常處理的地方,不要不顯示錯誤信息,什麼信息都不顯示,那樣沒法調試
D. 相冊管理 java實現 功能是圖片顯示與圖片放大縮小 急~~
上樓的我只想說你根本不懂java,這么簡單的功能都不能實現,還是一門編程語言嗎? 一、部分截圖: ①打開 ②放大 ③翻轉 ④縮小 二、源程序: import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.File;
public class PhotoFrame extends JFrame implements ActionListener{ Canvas photo;
JPanel p;
JButton open,bigger,smaller,rotate,exit;
JScrollPane sp;
JFileChooser fc;
int w = 150;
int h = 150;
Image image;
int rate = 10;//圖片放縮率(單位:像素)
public PhotoFrame(){
init();
this.setTitle ("Java圖片查看器");
this.setSize (600,500);
this.setLocationRelativeTo (this);//窗口居中
this.setVisible (true);
this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
public void init(){
photo = new Photo();
sp = new JScrollPane(photo);
p = new JPanel();
open = new JButton("open");
bigger = new JButton(" + ");
smaller = new JButton(" - ");
rotate = new JButton(" の ");
exit = new JButton("exit");
//設置前景色
open.setForeground (Color.BLUE);
bigger.setForeground (Color.GREEN);
smaller.setForeground (Color.GREEN);
rotate.setForeground (Color.GREEN);
exit.setForeground (Color.RED);
//設置提示文本
open.setToolTipText ("打開文件");
bigger.setToolTipText ("放大");
smaller.setToolTipText ("縮小");
rotate.setToolTipText ("翻轉");
exit.setToolTipText ("退出程序");
//設置邊框
p.setBorder (BorderFactory.createEtchedBorder ());
p.add (open);
p.add (bigger);
p.add (smaller);
p.add (rotate);
p.add (exit);
add(sp,BorderLayout.CENTER);
add(p,BorderLayout.SOUTH);
open.addActionListener (this);
bigger.addActionListener (this);
smaller.addActionListener (this);
rotate.addActionListener (this);
exit.addActionListener (this);
}
public static void main(String[] args){
new PhotoFrame();
} public void actionPerformed (ActionEvent e){
if(e.getSource ()==open){//打開
fc = new JFileChooser();
int returnval = fc.showOpenDialog(this);
if(returnval == JFileChooser.APPROVE_OPTION){
File f = fc.getSelectedFile ();
String fileName = f.getName ();
String filePath=fc.getSelectedFile().getAbsolutePath();
System.out.println(filePath);
this.setTitle (fileName+"-Java圖片查看器");
//通過文件路徑獲得圖片
image = new ImageIcon(filePath).getImage ();
//獲取圖片的寬和高
w = image.getWidth (this);
h = image.getHeight (this);
}
}else if(e.getSource ()==bigger){//放大
if(w>0) w+= rate;
else w-= rate;
if(h>0)h+= rate;
else h-= rate;
}else if(e.getSource ()==smaller){//縮小
if(w>0) w-= rate;
else w+= rate;
if(h>0) h-= rate;
else h+= rate;
}else if(e.getSource ()==rotate){//翻轉
if(w>0&&h>0){
h*=-1;
}else if(w>0&&h<0){
w*=-1;
}else if(w<0&&h<0){
h*=-1;
}else if(w<0&&h>0){
w*=-1;
}
}else{//退出
System.exit(0);
}
photo.repaint ();//重新繪制
}
class Photo extends Canvas{
public void paint(Graphics g){
int width = this.getWidth();
int height = this.getHeight();
//設置圖片左上角坐標
int x = (width-w)/2;
int y = (height-h)/2;
//繪制圖片
g.drawImage(image, x, y, w, h,this);
}
}
}
三、補充:1、滾動面板功能沒有具體實現2、放大縮小率應該按照圖片寬高比來設置,最好用一個滾動條來放大縮小3、翻轉功能需要改進 樓主自己試著完善下...
E. java圖片縮放
根據你的滑鼠移動事件,判斷你第一次點擊的點和最後一次的點,就可以算出這個句型區域的長和寬了,
下面代碼自己看
package com.itheima.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 製作圖片縮略圖
*
* @author seawind
*
*/
public class PicUtils {
private String srcFile;
private String destFile;
private int width;
private int height;
private Image img;
/**
* 構造函數
*
* @param fileName
* String
* @throws IOException
*/
public PicUtils(String fileName) throws IOException {
File _file = new File(fileName); // 讀入文件
this.srcFile = fileName;
// 查找最後一個.
int index = this.srcFile.lastIndexOf(".");
String ext = this.srcFile.substring(index);
this.destFile = this.srcFile.substring(0, index) + "_s" + ext;
img = javax.imageio.ImageIO.read(_file); // 構造Image對象
width = img.getWidth(null); // 得到源圖寬
height = img.getHeight(null); // 得到源圖長
}
/**
* 強制壓縮/放大圖片到固定的大小
*
* @param w
* int 新寬度
* @param h
* int 新高度
* @throws IOException
*/
public void resize(int w, int h) throws IOException {
BufferedImage _image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
_image.getGraphics().drawImage(img, 0, 0, w, h, null); // 繪制縮小後的圖
FileOutputStream out = new FileOutputStream(destFile); // 輸出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(_image); // 近JPEG編碼
out.close();
}
/**
* 按照固定的比例縮放圖片
*
* @param t
* double 比例
* @throws IOException
*/
public void resize(double t) throws IOException {
int w = (int) (width * t);
int h = (int) (height * t);
resize(w, h);
}
/**
* 以寬度為基準,等比例放縮圖片
*
* @param w
* int 新寬度
* @throws IOException
*/
public void resizeByWidth(int w) throws IOException {
int h = (int) (height * w / width);
resize(w, h);
}
/**
* 以高度為基準,等比例縮放圖片
*
* @param h
* int 新高度
* @throws IOException
*/
public void resizeByHeight(int h) throws IOException {
int w = (int) (width * h / height);
resize(w, h);
}
/**
* 按照最大高度限制,生成最大的等比例縮略圖
*
* @param w
* int 最大寬度
* @param h
* int 最大高度
* @throws IOException
*/
public void resizeFix(int w, int h) throws IOException {
if (width / height > w / h) {
resizeByWidth(w);
} else {
resizeByHeight(h);
}
}
/**
* 設置目標文件名 setDestFile
*
* @param fileName
* String 文件名字元串
*/
public void setDestFile(String fileName) throws Exception {
if (!fileName.endsWith(".jpg")) {
throw new Exception("Dest File Must end with \".jpg\".");
}
destFile = fileName;
}
/**
* 獲取目標文件名 getDestFile
*/
public String getDestFile() {
return destFile;
}
/**
* 獲取圖片原始寬度 getSrcWidth
*/
public int getSrcWidth() {
return width;
}
/**
* 獲取圖片原始高度 getSrcHeight
*/
public int getSrcHeight() {
return height;
}
}
F. java 圖片放縮與保存出現異常,求修改代碼
在 g.drawImage(img,0,0, newW,newH,null);加上一句:
g.scale( newW*1.0/img.getWidth(), newH*1.0/img.getHeight());
另:在return img前要 g.dispose();
G. java怎麼創建一個具有指定解析度的ImageIcon對象額就是如果原圖像過大,就會放縮;
自己寫,初始化時,傳入圖片,判斷是否過大,按縱橫不同,進行縮放