惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
V
Vulnerabilities – Threatpost
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
Latest news
Latest news
博客园 - 三生石上(FineUI控件)
美团技术团队
aimingoo的专栏
aimingoo的专栏
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
Y
Y Combinator Blog
T
Tailwind CSS Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
小众软件
小众软件
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tenable Blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
D
Docker
Cyberwarzone
Cyberwarzone
量子位
A
About on SuperTechFans
The Last Watchdog
The Last Watchdog
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Full Disclosure
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
IT之家
IT之家
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
L
Lohrmann on Cybersecurity
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News

博客园 - waya

解決MySQL中文亂碼 攝影用光 Flex調試工具Flextracepanel linux下安裝JDK5 Installing Flex Data Services on JBoss 得到不同時區的當前時間 - waya - 博客园 Flex實現的一些小應用,截幾個界面圖留驗 一個便宜的高负载网站架构 同時啟動多個Tomcat服務器 - waya - 博客园 在同一臺機器上同時啟動多個JBOSS spring2與spring1的單例模式的配置區別 Flex的多行表頭 Trace到文件的設置 開啟整屏窗口並無痕關閉父窗口 隱藏顯示表格行;確認提示窗口;開啟定制窗口 Log4j日志异步写入數據庫 參數URL編碼 時間字符串轉換 URL编码表一览
java的圖像縮略方法
waya · 2008-11-04 · via 博客园 - waya

圖像的縮略代碼


                    
//Image image = ImageIO.read(is);
                    Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());//可讀取丟失ICC信息的圖片
                    BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage
                    int w=image.getWidth(null);
                    
int h=image.getHeight(null);
                    
                    
//縮略圖的size
                    int size=getFileSize(flag);
                    
if(size==0)size=h;
                    
int nw=size;
                    
int nh=(nw*h)/w;
                    
if(nh>size){
                        nh
=size;
                        nw
=(nh*w)/h;
                    }                    
                    BufferedImage tag
=new BufferedImage(nw,nh,BufferedImage.TYPE_INT_RGB);
                    tag.getGraphics().drawImage(image.getScaledInstance(nw, nh, Image.SCALE_SMOOTH), 
00null);
                    FileOutputStream out
=new FileOutputStream(imageFile);
                    JPEGImageEncoder encoder
=JPEGCodec.createJPEGEncoder(out);
                    encoder.encode(tag);
                    out.close();

 以下是Image轉換BufferedImage代碼

public static BufferedImage toBufferedImage(Image image) {
        
if (image instanceof BufferedImage) {
            
return (BufferedImage)image;
        }
    
        
// This code ensures that all the pixels in the image are loaded
        image = new ImageIcon(image).getImage();
    
        
// Determine if the image has transparent pixels; for this method's
        
// implementation, see e661 Determining If an Image Has Transparent Pixels
        
//boolean hasAlpha = hasAlpha(image);
    
        
// Create a buffered image with a format that's compatible with the screen
        BufferedImage bimage = null;
        GraphicsEnvironment ge 
= GraphicsEnvironment.getLocalGraphicsEnvironment();
        
try {
            
// Determine the type of transparency of the new buffered image
            int transparency = Transparency.OPAQUE;
           
/* if (hasAlpha) {
                transparency = Transparency.BITMASK;
            }
*/
    
            
// Create the buffered image
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc 
= gs.getDefaultConfiguration();
            bimage 
= gc.createCompatibleImage(
                image.getWidth(
null), image.getHeight(null), transparency);
        } 
catch (HeadlessException e) {
            
// The system does not have a screen
        }
    
        
if (bimage == null) {
            
// Create a buffered image using the default color model
            int type = BufferedImage.TYPE_INT_RGB;
            
//int type = BufferedImage.TYPE_3BYTE_BGR;//by wang
            /*if (hasAlpha) {
                type = BufferedImage.TYPE_INT_ARGB;
            }
*/
            bimage 
= new BufferedImage(image.getWidth(null), image.getHeight(null), type);
        }
    
        
// Copy image to buffered image
        Graphics g = bimage.createGraphics();
    
        
// Paint the image onto the buffered image
        g.drawImage(image, 00null);
        g.dispose();
    
        
return bimage;
    }

以上的方法可以生成品質較高無鋸齒的新圖像文件

還有以下方法生成縮略圖的,如果是圖像失真較大, 圖形可以用以下方法

//BufferedImage src = ImageIO.read(is);
                    Image image=Toolkit.getDefaultToolkit().getImage(file.getPath());//用它可以讀取丟失ICC信息的圖片
                    BufferedImageBuilder bib=new BufferedImageBuilder();
                    BufferedImage src
=BufferedImageBuilder.toBufferedImage(image);
                    
//BufferedImage src=bib.bufferImage(image);
                    int w=src.getWidth();
                    
int h=src.getHeight();
                    
int size=getFileSize(flag);
                    
if(size==0)size=h;
                    
int nw=size;
                    
int nh=(nw*h)/w;
                    
if(nh>size){
                        nh
=size;
                        nw
=(nh*w)/h;
                    }
                    
                    
//縮圖的比例
                    double sx=(double)nw/w;
                    
double sy=(double)nh/h;
                    AffineTransform transform
=new AffineTransform();
                    transform.setToScale(sx, sy);
                    AffineTransformOp ato
=new AffineTransformOp(transform,null);
                    
int type=src.getColorModel().getColorSpace().getType();
                    
if(type==5){
                        
//type=BufferedImage.TYPE_3BYTE_BGR;
                        type=BufferedImage.TYPE_INT_RGB;
                    }
else if(type==6){
                        type
=BufferedImage.TYPE_BYTE_GRAY;
                    }
                    BufferedImage tag
=new BufferedImage(nw, nh,type);
                    ato.filter(src, tag);
                    
if(isGray&&type!=6){
                        
//生成灰色圖片
                        tag=getGrayImage(tag);
                    }
                    ImageIO.write(tag, 
"jpeg", imageFile);
                    tag.flush();
                    src.flush();
                    is.close();

把圖片轉成灰度圖

private BufferedImage getGrayImage(BufferedImage image){
        BufferedImage dstimage
=new BufferedImage(image.getWidth(),image.getHeight(),image.getType());
        Graphics2D g2
=dstimage.createGraphics();
        RenderingHints hints
=g2.getRenderingHints();
        g2.dispose();
        g2
=null;
        ColorSpace grayCS
=ColorSpace.getInstance(ColorSpace.CS_GRAY);
        ColorConvertOp colorConvertOp
=new ColorConvertOp(grayCS,hints);
        colorConvertOp.filter(image, dstimage);
        
return dstimage;
    }