编程图片裁剪
‘壹’ VB图片裁剪
Option Explicit
Private Sub Command1_Click()
Picture2.PaintPicture Picture1.Picture, 0, 0, Picture1.Width / 5, , Picture1.Width / 5 * 4
picture1.visible=false
End Sub
‘贰’ php如何实现图片的裁剪
php中裁剪图片主要使用gd库的imageresampled方法
$src_path='1.jpg';
//创建源图的实例
$src=imagecreatefromstring(file_get_contents($src_path));
//裁剪开区域左上角的点的坐标
$x=100;
$y=12;
//裁剪区域的宽和高
$width=200;
$height=200;
//最终保存成图片的宽和高,和源要等比例,否则会变形
$final_width=100;
$final_height=round($final_width*$height/$width);
//将裁剪区域复制到新图片上,并根据源和目标的宽高进行缩放或者拉升
$new_image=imagecreatetruecolor($final_width,$final_height);
imageresampled($new_image,$src,0,0,$x,$y,$final_width,$final_height,$width,$height);
//输出图片
header('Content-Type:image/jpeg');
imagejpeg($new_image);
imagedestroy($src);
imagedestroy($new_image);
public BufferedImage getSubimage(int x,
int y,
int w,
int h)返回由指定矩形区域定义的子图像。返回的 BufferedImage 与源图像共享相同的数据数组。
参数:
x - 指定矩形区域左上角的 X 坐标
y - 指定矩形区域左上角的 Y 坐标
w - 指定矩形区域的宽度
h - 指定矩形区域的高度
你先把分块的坐标弄好,在拿这个方法去拿没块的图就是了。
‘肆’ 我想要在opencv中用最小矩形外接图中图像并剪切截取出这个矩形部分。
试试 里面一些参数要改一下 这是c++
vector<vector<Point>> vecContour;
vector<Vec4i> hierarcy;
findContours(dst1, vecContour, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);//查找轮廓
Rect boundRect;//存放外接矩形
RotatedRect rorect;//存放最小外接矩形
Point2f rect[4];
//vector<vector<Point>>proRect;
//Mat imageContours = Mat::zeros(image.size(), CV_8UC1);
for (int i = 0; i < vecContour.size(); i++)
{
boundRect = boundingRect(Mat(vecContour[i]));
if (boundRect.width < 200 || boundRect.height < 200)
continue;
circle(dst1, Point(rorect.center.x, rorect.center.y), 5, Scalar(0, 255, 0), -1, 8); //绘制最小外接矩形的中心点
rorect.points(rect); //把最小外接矩形四个端点复制给rect数组
rectangle(dst1, Point(boundRect.x, boundRect.y), Point(boundRect.x + boundRect.width, boundRect.y + boundRect.height), Scalar(0, 255, 0), 2, 8);
for (int j = 0; j < 4; j++)
{
line(dst1, rect[j], rect[(j + 1) % 4], Scalar(255, 0, 0), 2, 8); //绘制最小外接矩形每条边
}
}
‘伍’ CAD图形中的图片怎么剪裁掉不用的部分
可以通过以下方法进行图片的剪切:
1、打开电脑中的一个CAD文档,插入一张图片后,用鼠标选中该图片,然后找到图片的夹点,如下:
‘陆’ 图像裁剪
遥感图像一景的范围往往很大,占用存储空间多,对其进行操作时运算速度慢。为了减少工作量,加快计算机运算速度,我们往往根据需要裁剪出想要的图像范围即可。按照ERDAS 实现图像分幅裁剪的过程,可以将图像分幅裁剪分为两种类型: 规则分幅和不规则分幅。
图 3. 40 Resample 对话框
3. 3. 2. 1 规则分幅裁剪(Rectangle Subset IMAGE)
规则分幅是指裁剪图像的边界范围是一个矩形,通过左上角和右下角两点的坐标,就可以确定图像的裁剪位置,整个裁剪过程比较简单。
ERDAS 图标面板菜单条: Main→Data Preparation→Data Preparation 菜单→选择 SubsetIMAGE→开 Subset IMAGE 对话框(图 3. 41);
ERDAS 图标面板工具条: 点击 Data Prep 图标→打开 Data Preparation 菜单→选择 Sub-set IMAGE→打开 Subset IMAGE 对话框(图 3. 41)。
在 Subset IMAGE 对话框中需要设置下列参数:
→输入文件名称(Input File): xh20000528. IMG;
→输出文件名称(Output File): xh000528_subset. IMG;
→坐标类型(Coordinate Type): Map;
→裁剪范围(Subset Definition): 输入 ULX、ULY、LRX、LRY;
→输出数据类型(Output Data Type): Unsigned 8 bit;
→输出统计忽略零值: Ignore Zero in Output Stats;
→输出像元波段(Select Layers): 1: 6(表示选择从第1 波段到第7 波段),4,3,2(表示选择 4,3,2 四个波段);
→OK(关闭 Subset IMAGE 对话框,执行图像裁剪)。
图 3. 41 Subset IMAGE 对话框
说明: ①在上述图像裁剪过程中,裁剪范围是通过直接输入左上角坐标和右下角坐标定义的。此外,还可以通过两种方式定义裁剪范围: 其一是应用查询框(Inquire Box),然后在 Subset IMAGE 对话框中选择 From Inquire Box 功能; 其二是应用 AOI,然后在 Sub-set IMAGE 对话框中选择 AOI 功能,打开 AOI 对话框,并确定 AOI 区域来自图像视窗即可。②输出波段的选择: 一种是用冒号表示从第几波段到第几波段,另外一种是用逗号隔开表示仅仅选择这几个波段。
3. 3. 2. 2 不规则分幅裁剪(Polygon Subset IMAGE)
不规则分幅裁剪是指裁剪图像的边界范围是个任意多边形,无法通过左上角和右下角两点的坐标确定图像的裁剪位置,而必须事先生成一个完整闭合多边形区域,可以是一个 AOI多边形,也可以是 ArcInfo 的一个 Polygon Coverage。针对不同的情况采用不同裁剪过程。
(1)AOI 多边形裁剪(Polygon AOI Subset IMAGE)
首先在视窗中打开需要裁剪的图像,并应用 AOI 工具绘制多边形 AOI,可以将多边形AOI 保存在文件中(* . AOI),也可以暂时不退出视窗,将图像与 AOI 多边形保留在视窗中,然后,在 Subset IMAGE 对话框中需要设置下列参数:
→输入文件名称(Input File): Lanier. IMG;
→输出文件名称(Output File): Lanier_sub. IMG;
→应用 AOI 确定裁剪范围: 点击 AOI 按钮;
→打开选择 AOI(Choose AOI)对话框(图 3. 42);
图 3. 42 Choose AOI 对话框
→在 Choose AOI 对话框中确定 AOI 的来源(AOI Source): Viewer 或 AOI File(如果选择 AOI File,则需要浏览找到此前的* . AOI 文件);
→输出数据类型(Output Data Type): Unsigned 8 bit;
→输出统计忽略零值: Ignore Zero in Output Stats;
→输出像元波段(Select Layers): 1: 6(表示选择从第1 波段到第7 波段),4,3,2(表示选择 4,3,2 四个波段);
→OK(关闭 Subset IMAGE 对话框,执行图像裁剪)。
(2)ArcInfo 多边形裁剪(Polygon Coverage Subset IMAGE)
如果按照行政区划边界或自然区划边界进行图像的分幅裁剪,往往是首先利用 ArcInfo或 ERDAS 的 Vector 模块绘制精确的边界多边形(Polygon),然后以 ArcInfo 的 Polygon 为边界条件进行图像裁剪。若是对地形图的内框范围进行裁剪,需要借助其他软件如 Map-GIS 生成标准内框设定裁剪范围。对于这种情况,需要调用 MapGIS 和 ERDAS 其他模块的操作分两步完成。
图 3. 43 生成 1∶5 万单线内框
第一步: 在 MapGIS 的投影变换子系统中根据四幅图像的左下角经纬度分别生成 4 个标准 1∶5 万单线内框(图 3. 43)。
第二步: 选择标准椭球,如图 3. 44 所示。
图 3. 44 选择椭球体
第三步: 对生成的标准内框进行投影转换,如图 3. 45 所示。
图 3. 45 对内框进行投影转换
第四步: 选择投影转换的内框文件,如图 3. 46 所示。
图 3. 46 选择投影文件或目录
第五步: 设置输入坐标系类型和投影类型、比例尺分母、及坐标单位、投影带类型及投影带号,如图 3. 47 所示。
图 3. 47 设置输入坐标系类型和投影类型
第六步: 设置输出坐标系类型和投影类型、比例尺分母及坐标单位、投影带类型及投影带序号,如图 3. 48 所示。
第七步: 在 MapGIS 的输入编辑中按照生成的内框新建一个工程,将四个单线分别进行拓扑,如图 3. 49~ 图 3. 51 所示。
图 3. 48 设置输出坐标系类型和投影类型
图 3. 49 设置新建工程的地图参数
图 3. 50 在新建工程中加载内框文件
图 3. 51 对内框进行拓扑
第八步: 文件转换,在 MapGIS 的文件转换中将拓扑好的文件(* . WP)转成 Shp 文件格式,如图 3. 52 所示。
第九步: 矢量栅格化,将 Shp 格式的单线内框进行矢量栅格化,栅格化得到的图像,用 IMAGE Command Tool 命令重新赋一次投影信息。再进行 Mask 掩膜处理,得到用内框裁剪的图像,如图 3. 53,图 3. 54 所示。
第十步: 查看矢量栅格化结果,如图 3. 55 所示,图中没有投影信息。
第十一步: 加载投影信息,如图 3. 56,图 3. 57 所示,此时加载的投影信息需要和地形图校正时需要的信息一致。
第十二步: 查看附有投影信息的文件,如图 3. 58 所示。
第十三步: 进行掩膜操作,执行图像裁剪,在 Mask 掩膜对话框中设置需要裁剪的图像文件以及膜文件、输出文件类型等,如图 3. 59,图 3. 60 所示。
通过上述过程可以得到内框范围内的地形图。
图 3. 52 将* . WP 文件转换为* . Shp 文件
图 3. 53 矢量栅格化菜单
图 3. 54 Vector to Raster 对话框
3. 3. 2. 3 使用 AOI 定义裁剪范围,提取出区域范围
第一步: 在视图窗口分别打开 Shp 格式的内框,选择单个区域保存为 AOI 文件,用AOI 定义区域范围。然后用 Subset 进行裁剪,得到用内框裁剪的图像,如图 3. 61~ 图3. 64 所示。
两种方法比较:
1)用 Mask 掩膜方法进行裁剪,需要重新附加投影信息,裁剪结果占用的磁盘空间较少,过程较复杂。
图 3. 55 矢量栅格化结果
图 3. 56 IMAGE Commands 对话框
2)使用 AOI 定义裁剪范围时,可以减少附加投影信息的过程,但是裁剪结果占用的磁盘空间并没有减少,过程较简单。
图 3. 57 选择投影类型
图 3. 58 附有投影信息的文件
图 3. 59 掩膜工具
图 3. 60 Mask 对话框
‘柒’ 如何在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);
}
}
‘捌’ C++如何用GDI+裁剪图片
Image* FixedSize(Image *imgSrc, int Width, int Height)
{
int w,h;
w = imgSrc->GetWidth ();
h = imgSrc->GetHeight ();
if (w<h) //图片是竖着的 交换Width和Height
{
Width = Width + Height;
Height = Width - Height;
Width = Width - Height;
}
Bitmap *bmPhoto = new Bitmap(Width, Height);
bmPhoto->SetResolution(imgSrc->GetHorizontalResolution(),imgSrc->GetVerticalResolution());
Graphics grPhoto(bmPhoto);
grPhoto.Clear((ARGB)Color::White);
grPhoto.SetInterpolationMode();
grPhoto.DrawImage(imgSrc,0,0,Width,Height);
return bmPhoto;
}int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
} free(pImageCodecInfo);
return -1; // Failure
}
‘玖’ MATLAB中如何批量剪裁彩色图片
MATLAB中如何批量剪裁彩色图片
答:
使用matlab批量的在图片中裁剪指定像素大小的图片,附:matlab代码
for
k=1:1
p=k;
q=int2str(p);
path='G:\plant数据\P4\1h\';
i=imread(strcat(path,num2str(k),'.tif'));
[I2,rect]
=
imcrop(i,[225,225,575,575]);
%若有一个图像为i,在matlab中进行如下操作,imcrop的参数为[2,2,2,2]
%代表左上角坐标为[2,2],裁剪的长度2,宽度为2。
figure(1);
imshow(i);
hold
on
x1=rect(1);
x2=rect(2);
w=rect(3);
h=rect(4);
rectangle('Position',[x1,x2,w,h],
'EdgeColor','y');
x3=x1+w;
x4=x2+h;
hold
off
figure(2);
imshow(I2);
imwrite(I2,strcat('G:\plant数据\',num2str(k),'.tif'));
end