java中怎麼切割圖片
Ⅰ 用java如何將一張圖片切割成九塊,然後保存在自己的系統盤里
用bufferImage類的SubImage方法,切割,然後用ImageIO的靜態方法,write寫出到文本。
Ⅱ 如何在Java中進行圖片剪裁 瘋狂JAVA
packagetest;
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.geom.AffineTransform;
importjava.awt.image.AffineTransformOp;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjava.nio.Buffer;
importjavax.imageio.ImageIO;
importjavax.imageio.stream.ImageOutputStream;
/**
*裁剪、縮放圖片工具類
*
*@authorCSDN沒有夢想-何必遠方
*/
publicclassImgUtils{
/**
*縮放圖片方法
*
*@paramsrcImageFile
*要縮放的圖片路徑
*@paramresult
*縮放後的圖片路徑
*@paramheight
*目標高度像素
*@paramwidth
*目標寬度像素
*@parambb
*是否補白
*/
publicfinalstaticvoidscale(StringsrcImageFile,Stringresult,
intheight,intwidth,booleanbb){
try{
doubleratio=0.0;//縮放比例
Filef=newFile(srcImageFile);
BufferedImagebi=ImageIO.read(f);
Imageitemp=bi.getScaledInstance(width,height,bi.SCALE_SMOOTH);//bi.SCALE_SMOOTH
//選擇圖像平滑度比縮放速度具有更高優先順序的圖像縮放演算法。
//計算比例
if((bi.getHeight()>height)||(bi.getWidth()>width)){
doubleratioHeight=(newInteger(height)).doubleValue()
/bi.getHeight();
doubleratioWhidth=(newInteger(width)).doubleValue()
/bi.getWidth();
if(ratioHeight>ratioWhidth){
ratio=ratioHeight;
}else{
ratio=ratioWhidth;
}
AffineTransformOpop=newAffineTransformOp(AffineTransform//仿射轉換
.getScaleInstance(ratio,ratio),null);//返回表示剪切變換的變換
itemp=op.filter(bi,null);//轉換源BufferedImage並將結果存儲在目標
//BufferedImage中。
}
if(bb){//補白
BufferedImageimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);//構造一個類型為預定義圖像類型之一的
//BufferedImage。
Graphics2Dg=image.createGraphics();//創建一個
//Graphics2D,可以將它繪制到此
//BufferedImage中。
g.setColor(Color.white);//控制顏色
g.fillRect(0,0,width,height);//使用Graphics2D上下文的設置,填充Shape
//的內部區域。
if(width==itemp.getWidth(null))
g.drawImage(itemp,0,(height-itemp.getHeight(null))/2,
itemp.getWidth(null),itemp.getHeight(null),
Color.white,null);
else
g.drawImage(itemp,(width-itemp.getWidth(null))/2,0,
itemp.getWidth(null),itemp.getHeight(null),
Color.white,null);
g.dispose();
itemp=image;
}
ImageIO.write((BufferedImage)itemp,"JPEG",newFile(result));//輸出壓縮圖片
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*裁剪圖片方法
*
*@parambufferedImage
*圖像源
*@paramstartX
*裁剪開始x坐標
*@paramstartY
*裁剪開始y坐標
*@paramendX
*裁剪結束x坐標
*@paramendY
*裁剪結束y坐標
*@return
*/
(BufferedImagebufferedImage,
intstartX,intstartY,intendX,intendY){
intwidth=bufferedImage.getWidth();
intheight=bufferedImage.getHeight();
if(startX==-1){
startX=0;
}
if(startY==-1){
startY=0;
}
if(endX==-1){
endX=width-1;
}
if(endY==-1){
endY=height-1;
}
BufferedImageresult=newBufferedImage(endX-startX,endY-startY,
4);
for(intx=startX;x<endX;++x){
for(inty=startY;y<endY;++y){
intrgb=bufferedImage.getRGB(x,y);
result.setRGB(x-startX,y-startY,rgb);
}
}
returnresult;
}
publicstaticvoidmain(String[]args)throwsIOException{
Fileinput=newFile("input.jpg");
BufferedImageimg=ImageIO.read(input);
cropImage(img,10,10,20,20);
Fileoutput=newFile("output.jpg");
ImageIO.write(img,"jpg",output);
}
}
Ⅲ Java能切割別拉伸圖片嗎
當然可以啊。。。
package com.imagecut;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageCut {
/**
* @param args
*/
public static void main(String[] args) {
try {
ImageCut.cutImage("D:\\app_work\\eclipse_work\\myeclipse6.0.1_workspace\\chenwrite\\WebRoot\\imageCut\\img\\a.jpg", 300,300,70,20, 150, 150);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 生成縮放後的圖片和剪裁後的圖片
* @param srcPath 原圖片的路徑
* @param scale 縮放比例
* @param startX 剪裁框的起始坐標 X
* @param startY 剪裁框的起始坐標 Y
* @param width 剪裁後的圖片寬度
* @param height 剪裁後的圖片高度
* @throws IOException IOException
*/
public static void cutImage(String srcPath, double scale, int startX, int startY, int width, int height) throws IOException {
File srcFile = new File(srcPath);
BufferedImage image = ImageIO.read(srcFile);
int srcWidth = image.getWidth(null);
int srcHeight = image.getHeight(null);
cutImage(srcPath, (int)(srcWidth * scale), (int)(srcHeight * scale), startX, startY, width, height);
}
/**
* 生成縮放後的圖片和剪裁後的圖片
* @param srcPath 原圖片的路徑
* @param scaleWidth 縮放後的圖片寬度度
* @param scaleHeight 縮放後的圖片高度
* @param startX 剪裁框的起始坐標 X
* @param startY 剪裁框的起始坐標 Y
* @param width 剪裁後的圖片寬度
* @param height 剪裁後的圖片高度
* @throws IOException IOException
*/
public static void cutImage(String srcPath, int scaleWidth, int scaleHeight, int startX, int startY, int width, int height) throws IOException {
File srcFile = new File(srcPath);
BufferedImage image = ImageIO.read(srcFile);
BufferedImage newImage = new BufferedImage(scaleWidth, scaleHeight, BufferedImage.TYPE_INT_RGB);
newImage.getGraphics().drawImage(image.getScaledInstance(scaleWidth, scaleHeight, Image.SCALE_SMOOTH), 0, 0, null);
//保存縮放後的圖片
String fileName = srcFile.getName().substring(0,srcFile.getName().lastIndexOf("."));
String fileSufix = srcFile.getName().substring(srcFile.getName().lastIndexOf(".") + 1);
File scaleFile = new File(srcFile.getParent(), fileName + "_scale" + "." + fileSufix);
ImageIO.write(newImage, fileSufix, scaleFile);
//保存裁剪後的圖片
File scaleCutFile = new File(srcFile.getParent(), fileName + "_scale_cut" + "." + fileSufix);
ImageIO.write(newImage.getSubimage(startX, startY, width, height), fileSufix, scaleCutFile);
}
}
/**
public static void cutImage(String srcPath, int width, int height) throws IOException {
File srcFile = new File(srcPath);
BufferedImage image = ImageIO.read(srcFile);
int srcWidth = image.getWidth(null);
int srcHeight = image.getHeight(null);
int newWidth = 0, newHeight = 0;
int x = 0, y = 0;
double scale_w = (double)width/srcWidth;
double scale_h = (double)height/srcHeight;
System.out.println("scale_w="+scale_w+",scale_h="+scale_h);
//按原比例縮放圖片
if(scale_w < scale_h) {
newHeight = height;
newWidth = (int)(srcWidth * scale_h);
x = (newWidth - width)/2;
} else {
newHeight = (int)(srcHeight * scale_w);
newWidth = width;
y = (newHeight - height)/2;
}
BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
newImage.getGraphics().drawImage(
image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
// 保存縮放後的圖片
String fileSufix = srcFile.getName().substring(srcFile.getName().lastIndexOf(".") + 1);
File destFile = new File(srcFile.getParent(), UUID.randomUUID().toString() + "." + fileSufix);
// ImageIO.write(newImage, fileSufix, destFile);
// 保存裁剪後的圖片
ImageIO.write(newImage.getSubimage(x, y, width, height), fileSufix, destFile);
}
*/
最後一個方法中,有兩個步驟:1做圖片縮放,2做圖片切割。。。你也可以換個位置,先切割,在縮放。。。
Ⅳ java 圖片切割 求助
BufferedImage類有一個getSubimage()方法,以下來自API
public BufferedImage getSubimage(int x,
int y,
int w,
int h)
返回由指定矩形區域定義的子圖像。返回的 BufferedImage 與源圖專像共享相同的數據數屬組。
參數:
x - 指定矩形區域左上角的 X 坐標
y - 指定矩形區域左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
返回:
BufferedImage,它是此 BufferedImage 的子圖像。
拋出:
RasterFormatException - 如果指定區域不包含在此 BufferedImage 中
Ⅳ 用java做拼圖游戲,怎麼把圖片切割成不規則形狀
以我現在的知識,我還不知道如何更簡單的去做。
但如果以實現方式來講,
一種是人工將圖片這種形狀
一種是 非常麻煩,需要程序進行大量計算。要對圖片轉換成 int 數值 有所了解
我想我只能提供你思路,因為具體實現是比較麻煩的
因為我不是講語文的,不知道能不能說明白,比較意識流。。。
人工將圖片的幾種形狀畫出一種以指定顏色背景的半透明的圖,,
比如方案為
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■□■□□■□□■□□■□■■
□□□□□□□□□□□□□□□□
□□■□□□□■■□□□□■□□
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■■■□□■■■■□□■■■■
■■■■□□■■■■□□■■■■
我想我畫的試例圖你明白了吧,是可以進行對接拼圖的
一個比如說紅色圖片 4*4大小的,那麼他轉成int數據時就是
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0x後面的ff表示是不透明的
第二個ff及後面的4個0表示圖片顏色前2位是紅中間是綠最後是藍 這一點你可以用photoshop去查看
比如我上面第一張圖的數據,轉成int 數據時,就應該是
A B C D
1 0xffff0000 0xffff0000 0xffff0000 0xffff0000
2 0xffff0000 0xffff0000 0xffff0000 0x00ffffff
3 0xffff0000 0xffff0000 0xffff0000 0xffff0000
4 0xffff0000 0xffff0000 0xffff0000 0x00ffffff
5 0xffff0000 0xffff0000 0x00ffffff 0xffff0000
其中 D2 D4 及C5的位置是透明的0x00表示透明
說到這,也就是說,你應該能通過你生成的那幾個指定的圖片獲得這幾個圖片對應的數據模板
之後你將你的要拼圖的圖片,按你設計好的模板拼圖方式,生成圖片塊 注意,因為你要的效果是兩個圖片對接的,所以在生成的時候,也要注意,是對接的
如果你做到這一步,(或說成,你能想明白到這一步,哪怕不知道怎麼做,沒關系)
你這時應該能得到每塊圖片,和每塊圖片對應的是哪種模板
將這塊圖片轉成int 數組形式的 數據文件。
之後將這個數據文件與對應的模板數據文件進行對應,
當發現你的模板的數據值為0x00ffffff時,就說明這個位置的顏色應該是透明的,這時因為你的圖片數據與模版數據ID是相對應的,直接找到圖片數據ID,將他的值改為0x00ffffff就可以了。
到這一步,你應該可以實現將所有分割後的圖片,在數據上轉換成了你想要的樣子。
這時,你只要通過一些函數將數據文件轉換成圖片格式就行了。
因為我做的是手機方面的,你用的可能是J2SE吧,API我不是很熟,不能提供具體的方法。
Ⅵ 怎麼用java切割出不規則圖形的圖片
//用基本圖形拼呀
import java.awt.Graphics;
import javax.swing.*;
public class IrregulaShape extends JPanel{
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawRect(100, 50,100, 100);
g.drawArc(100, 25, 50, 50, 0, 180);
//g.fillRect(100, 50, 100, 100);
//g.fillOval(100, 25, 50, 50);
}
public static void main(String[] args) {
JFrame jFrame = new JFrame("不規則的!");
IrregulaShape j = new IrregulaShape();
jFrame.add(j);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(500,500);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
}
}
Ⅶ 用java把這張圖片切割,把每一個數字都切割出來,切割成一個一個的小圖片
暫時只能上傳一個。
Ⅷ 如何用java實現切割一張圖片
BufferedImage類有來一個getSubimage()方法,以下來自自API
public BufferedImage getSubimage(int x,
int y,
int w,
int h)
返回由指定矩形區域定義的子圖像。返回的 BufferedImage 與源圖像共享相同的數據數組。
參數:
x - 指定矩形區域左上角的 X 坐標
y - 指定矩形區域左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
返回:
BufferedImage,它是此 BufferedImage 的子圖像。
拋出:
RasterFormatException - 如果指定區域不包含在此 BufferedImage 中
Ⅸ 求一個Java切割圖片的函數
BufferedImage類下來面有這么一個方法:源
getSubimage
public BufferedImage getSubimage(int x,
int y,
int w,
int h)
返回由指定矩形區域定義的子圖像。返回的 BufferedImage 與源圖像共享相同的數據數組。
參數:
x - 指定矩形區域左上角的 X 坐標
y - 指定矩形區域左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
返回:
BufferedImage,它是此 BufferedImage 的子圖像。
拋出:
RasterFormatException - 如果指定區域不包含在此 BufferedImage 中。
Ⅹ java編程怎麼才能分割圖片
public BufferedImage getSubimage(int x,
int y,
int w,
int h)返回由指定矩形區域定義的子圖像。返回的 BufferedImage 與源圖像共享相同的數據數組。
參數專:
x - 指定矩形區域左上角的 X 坐標
y - 指定矩形區域左上角的 Y 坐標
w - 指定矩形區域的寬度
h - 指定矩形區域的高度
你先把分塊的坐屬標弄好,在拿這個方法去拿沒塊的圖就是了。