2018-05-10 22:35:49 qq_37486501 阅读数 16279
  • FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK

    FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

    44149 人正在学习 去看看 殷汶杰

以灰度图像circuit.tif为例,利用Matlab图像处理工具箱中的imresize函数对图像进行比例缩放变换。要求:创建4个figure窗口(不可以用subplot,显示不出来放大效果),分别用于显示原始图像、等比例放大1.5倍后的图像、等比例缩小0.5倍后的图像、缩放为高190宽400的图像(实现不等比例缩放)。并保存缩放后的所有图像文件到当前目录中。

I=imread('circuit.tif');
F=imresize(I,1.5,'nearest');
imwrite(F,'circuitFangda1_5.tif');
S=imresize(I,0.5,'nearest');
imwrite(S,'circuitSuoxiao0_5.tif');
J=imresize(I, [190,400],'nearest');
imwrite(J,'circuitbudengbi190_400.tif');
figure(1);
imshow(I);
figure(2);
imshow(F);
figure(3);
imshow(S);
figure(4);
imshow(J);


2020-01-20 20:51:52 weixin_39151703 阅读数 107
  • FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK

    FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

    44149 人正在学习 去看看 殷汶杰

python图像处理——图片缩放与裁剪工具

使用场景

图片缩放与裁剪工具利用画布技术可读取图片,按照像素对图片进行缩放操作,可选择图片裁剪区域或设定裁剪大小拖动选择裁剪区域对图片进行裁剪,可保存处理后的图片。

使用方法

1.打开工具
在这里插入图片描述
2.点击选择文件,选择要处理的图片
在这里插入图片描述
3.设定缩放尺寸,宽度和高度,优先按照宽度进行比例缩放,若设置高度,则按照高度进行比例缩放
在这里插入图片描述
图片缩放时,窗口会根据图片大小进行自适应
4.裁剪图片,若不填写裁剪尺寸,点击选择区域,可通过鼠标拖动选择区域
在这里插入图片描述
选择的区域会红色虚框标识
5.点击裁剪则将裁剪图片,并自适应窗口
在这里插入图片描述
可通过缩放将图片进行放大
6.若设定裁剪尺寸,点击选择区域,会虚框显示区域,可通过鼠标拖动移动区域
在这里插入图片描述
7.若对选择的区域不满意,可进行刷新页面,重新设定选择
在这里插入图片描述
8.选择完成后可点击裁剪对图片进行裁剪
在这里插入图片描述
9.图片处理完成后,可点击保存文件,保存图片
在这里插入图片描述

重点代码

1.图片缩放

def Resize(w, h, w_box, h_box, pil_image):
  f1 = 1.0*w_box/w 
  f2 = 1.0*h_box/h
  factor = min([f1, f2])
  width = int(w*factor)
  height = int(h*factor)
  return pil_image.resize((width, height), Image.ANTIALIAS)

2.窗口和画布自适应

pil_im = Image.open(showFile)  # 打开文件
w, h = pil_im.size  # 获取图片大小
photo = ImageTk.PhotoImage(pil_im)
gw, gh = GmSize(w, h)  # 图片与窗口大小对应函数
root.geometry(f"{gw}x{gh}")  # 设置窗口大小
canvas.config(width=w, height=h)  # 设置画布大小
canvas.create_image(w / 2, h / 2, image=photo)  # 在画布上画图

3.选择区域虚线框

# 矩形框,由左上角点和右下角点坐标确定,dash为虚线
canvas.create_rectangle(rectangle[0], rectangle[1], rectangle[2], rectangle[3], outline="red", dash=(3, 3)) 

4.画布绑定鼠标点击、拖动事件

canvas.bind("<Button-1>", Reset)  # 绑定鼠标左键按下
canvas.bind("<B1-Motion>", GetPoints)  # 绑定鼠标拖动
canvas.bind("<ButtonRelease-1>", MouseUp)  # 绑定鼠标左键松开

工具下载地址

https://download.csdn.net/download/weixin_39151703/12116481

2016-06-16 11:29:30 Dancer2015 阅读数 6066
  • FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK

    FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

    44149 人正在学习 去看看 殷汶杰

1.按比例缩放。

//按比例缩放,size是你要把图显示到 多大区域 ,例如:CGSizeMake(300, 400)

-(UIImage *) imageCompressForSize:(UIImage *)sourceImage targetSize:(CGSize)size{

   UIImage *newImage = nil;

   CGSize imageSize = sourceImage.size;

   CGFloat width = imageSize.width;

   CGFloat height = imageSize.height;

   CGFloat targetWidth = size.width;

   CGFloat targetHeight = size.height;

   CGFloat scaleFactor = 0.0;

   CGFloat scaledWidth = targetWidth;

   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.00.0);

    

   if(CGSizeEqualToSize(imageSize, size) == NO){

       CGFloat widthFactor = targetWidth / width;

       CGFloat heightFactor = targetHeight / height;


       if(widthFactor > heightFactor){

            scaleFactor = widthFactor;

        }else{

            scaleFactor = heightFactor;

        }

        scaledWidth = width * scaleFactor;

        scaledHeight = height * scaleFactor;

        

       if(widthFactor > heightFactor){            

            thumbnailPoint.y = (targetHeight - scaledHeight) *0.5;

        }elseif(widthFactor < heightFactor){

            thumbnailPoint.x = (targetWidth - scaledWidth) *0.5;

        }

    }

    

    UIGraphicsBeginImageContext(size);

    CGRect thumbnailRect = CGRectZero;

    thumbnailRect.origin = thumbnailPoint;

    thumbnailRect.size.width = scaledWidth;

    thumbnailRect.size.height = scaledHeight;

    [sourceImagedrawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();


   if(newImage == nil){

        NSLog(@"scale image fail");

    }

    UIGraphicsEndImageContext();

   return newImage;

}


2.指定宽度按比例缩放。

//指定宽度按比例缩放

-(UIImage *)imageCompressForWidth:(UIImage *)sourceImage targetWidth:(CGFloat)defineWidth{

   UIImage *newImage = nil;

   CGSize imageSize = sourceImage.size;

   CGFloat width = imageSize.width;

   CGFloat height = imageSize.height;

   CGFloat targetWidth = defineWidth;

   CGFloat targetHeight = height / (width / targetWidth);

   CGSize size = CGSizeMake(targetWidth, targetHeight);

   CGFloat scaleFactor = 0.0;

   CGFloat scaledWidth = targetWidth;

   CGFloat scaledHeight = targetHeight;

   CGPoint thumbnailPoint = CGPointMake(0.00.0);

    

   if(CGSizeEqualToSize(imageSize, size) ==NO){

       CGFloat widthFactor = targetWidth / width;

       CGFloat heightFactor = targetHeight / height;


       if(widthFactor > heightFactor){

            scaleFactor = widthFactor;

        }else{

            scaleFactor = heightFactor;

        }

        scaledWidth = width * scaleFactor;

        scaledHeight = height * scaleFactor;

        

       if(widthFactor > heightFactor){

            thumbnailPoint.y = (targetHeight - scaledHeight) *0.5;

        }else if(widthFactor < heightFactor){

            thumbnailPoint.x = (targetWidth - scaledWidth) *0.5;

        }

    }

    UIGraphicsBeginImageContext(size);

    CGRect thumbnailRect = CGRectZero;

    thumbnailRect.origin = thumbnailPoint;

    thumbnailRect.size.width = scaledWidth;

    thumbnailRect.size.height = scaledHeight;

    [sourceImagedrawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();

    

   if(newImage == nil){

        NSLog(@"scale image fail");

    }

    UIGraphicsEndImageContext();

   return newImage;

}

2019-05-19 10:32:28 majianxiong_lzu 阅读数 77
  • FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK

    FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

    44149 人正在学习 去看看 殷汶杰

使用Java实现一个简单的图像处理工具类,可完成图像安装一定比例缩放,代码如下:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 图像缩放工具类
 */
public class ImageUtils {
    /**
     * 缩放图像
     *
     * @param src   原始图像
     * @param scale 缩放比例
     * @return
     */
    public static BufferedImage zoomByScale(BufferedImage src, double scale) {
        //获取缩放后的长和宽
        int width = (int) (scale * src.getWidth());
        int height = (int) (scale * src.getHeight());
        Image instance = src.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        //新建一个和Image对象相同大小的画布
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //获取画笔
        Graphics2D graphics = image.createGraphics();
        //将Image对象画在画布上,最后一个参数,ImageObserver:接收有关 Image 信息通知的异步更新接口,没用到直接传空
        graphics.drawImage(instance, 0, 0, null);
        //释放资源
        graphics.dispose();
        return image;
    }

    /**
     * 缩放图像,并保存至特定路径
     *
     * @param src    原始图像路径
     * @param dest   缩放图像路径
     * @param format 缩放图像格式
     * @param scale  缩放比例
     * @throws IOException
     */
    public static void zoomByScale(String src, String dest, String format, double scale) throws IOException {
        BufferedImage srcImg = ImageIO.read(new File(src));
        int width = (int) (scale * srcImg.getWidth());
        int height = (int) (scale * srcImg.getHeight());
        Image instance = srcImg.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = image.createGraphics();
        graphics.drawImage(instance, 0, 0, null);
        graphics.dispose();
        ImageIO.write(image, format, new FileOutputStream(new File(dest)));
    }

    public static void main(String[] args) throws IOException {
        //缩小
        BufferedImage src = ImageIO.read(new File("E:/image/1.jpg"));
        BufferedImage image = zoomByScale(src, 0.6);
        //图像处理
//        image.getHeight();
        //另存
        ImageIO.write(image, "jpg", new FileOutputStream(new File("E:/image/1-1.jpg")));

        //放大图片
        zoomByScale("E:/image/1.jpg", "E:/image/1-2.jpg", "jpg", 1.2);
    }
}

测试效果
在这里插入图片描述
在这里插入图片描述

2019-04-07 17:57:24 lena_bmp 阅读数 109
  • FFMpeg视频开发与应用基础——使用FFMpeg工具与SDK

    FFMpeg是当今为的面向音视频开发的开源工程,广泛应用于多种音视频的客户端、播放器和流媒体服务器中。使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频水印和视频缩放等多种需求的开发。

    44149 人正在学习 去看看 殷汶杰

#用Visual C++实现图像双线性插值法等比例缩放
  在数字图像处理中,图像的缩放是基本的操作。下面介绍利用Visual C++ MFC多文档应用程序对话框,基于双线性插值法来实现图像缩放的功能,本实验采用Visual Studio 2017完成。
  MFC多文档应用程序的建立步骤略,代码中已经提前加入了图像的读取功能(在Doc类中,可在大部分Visual C++数字图像处理参考书中找到源代码)。
  先添加一个对话框,在资源视图中右键点击menu,点击插入dialog即可
  插入的对话框最好改一下ID,比如我这里叫ID_Zoom。再向其中添加一个Edit Control控件用于输入缩放比例因子,同样最好修改一下ID(我这里叫IDC_Ratio),旁边再加一个static text文本框用作说明。在这里插入图片描述
  然后需要为该对话框添加一个类,类名自定。基类可选择CDialog或CDialogEx,后者是前者的扩展类,具有CDialog的全部功能和一些新功能,这里我选择的是CDialog。
  创建完成后在该对话框类的头文件中加入成员变量Zoom,为缩放比例,类型为double。关于为新创建的类添加成员变量和成员函数,既可以直接在类的头文件中声明,也可以用类向导创建。由于前一种方法需要自行添加消息响应,比较麻烦,因此推荐直接利用类向导添加,方法为右键点击对话框空白处,选择添加变量,在弹出的“添加控件变量”对话框中为相应的控件(此处为IDC_Ratio,即Edit Control控件)添加变量,记得将“类别”设置为“值”,变量类型改为double
  下一步在资源视图menu中添加相应事件,并为其添加事件处理程序在这里插入图片描述
处理程序选择View类的command类型,点击添加编辑
  接下来就开始正式编写程序。
在这里插入图片描述
  首先要明白一点,位图作为若干个像素点的集合,在缩放过程中不可避免地会产生像素点的增加或减少。以放大为例,假如放大两倍则会多出原来图像三倍的像素点。这些多出来的像素点如何进行填充?基本的方法是把处理后的图片向原图进行映射,也成为向后映射,比如原图中一个点的位置为(5,4),在放大2倍后的图像中的坐标就变成了(10,8)。把放大后的图片中的任意一个像素点向原图映射,如放大2倍后的图片中某一像素点A坐标为A(15,9),则该像素点在原图中对应的坐标即B(7.5,4.5)。但我们知道像素坐标都是BYTE(或unsigned char)类型,不会出现小数值,因此就需要用B周围的点的灰度值来进行相应运算作为A点的灰度值。一种方法是最邻近插值法,也就是说计算一下B点离哪个像素点最近,则直接把该像素点的灰度值赋给B,但是由于该方法过于简单粗暴,因此获得的图像往往不够清晰;另一种方法——双线性插值法则较好地解决了这一问题,它的基本思想是将B点周围的四个像素点按权计算灰度赋给A点。权值的选取取决于距离的远近,离B点越近的点计算灰度权重最大。以下是一个双线性插值原理的示意图,生动形象。
  在这里插入图片描述
  计算方法如下:若某一向后映射点C(4.1,5.7),它周围的四个点为C1(4,5)、C2(4.6)、C3(5,5)、C4(5,6)。在纵向上,C点离C1、C2较近,离C3、C4较远,距离比为1:9,那么对应的C点原映射点的灰度值就应该等于C1、C2综合起来的灰度值gray12和C3、C4综合的灰度值gray34乘以0.9和0.1两个权值所得值,至于这个gray12和gray34怎么计算,则还是同样的方法。根据C点离C1、C2的距离l1、l2可按权计算出gray12=(gray1l2+gray2l1)/(l1+l2)。因此不难看出该方法通过两次权值线性分配来计算灰度值,因此得名双线性插值法。
接下来就是快乐的代码实现过程。由于之前我已经在Doc类头文件中声明过一些变量,此处直接用Doc类指针调用其中的数据。
这是代码中调用的头文件的成员变量

void CMFCApplication7View::OnZoom()
{
	// TODO: 在此添加命令处理程序代码
	ZoomDlg cgt;

	if (cgt.DoModal())//判断是否打开模式对话框。如果不调用对话框的DoModal方法,点击menu里添加的图像缩放后,之前创建的对话框ID_Ratio就不会弹出来
	{
		CMFCApplication7Doc *pDoc = GetDocument();

		ASSERT_VALID(pDoc);

		UINT outWidth;
		UINT outHeight;
	
		//pDoc->imageWidth = (UINT)(1.0*pDoc->imageWidth / 4.0 + 0.5) * 4;
		//pDoc->lpbmi->bmiHeader.biWidth = pDoc->imageWidth;

		UINT inWidth = pDoc->imageWidth;
		UINT inHeight = pDoc->imageHeight;
		UINT inSize = inWidth * inHeight;	

		outWidth = (UINT)(1.0*inWidth* cgt.Zoom / 4.0 + 0.5) * 4;
		outHeight = (UINT)(1.0*inHeight* cgt.Zoom + 0.5);//宽高为缩放后的图像宽高
		UINT outSize = outWidth * outHeight;

		int i, j;
		
		unsigned char * pBits = pDoc->m_pBits;
		unsigned char * pOldBits;

		pDoc->lpbmi->bmiHeader.biWidth = outWidth;
		pDoc->lpbmi->bmiHeader.biHeight = outHeight;
		pDoc->imageWidth = outWidth;
		pDoc->imageHeight = outHeight;

		if (pDoc->m_nColorBits == 8)
		{		
			pOldBits = new unsigned char[inSize];
			if (pOldBits == NULL)
				return;

			memcpy(pOldBits, pBits, inSize);//把原图像中的数据拷贝到pOldBits里

			delete[] pBits;	

			pBits = new unsigned char[outSize];
			if (pBits == NULL)
				return;

			pDoc->m_pBits = pBits;
			memset(pBits, 0, outSize);

			for ( j = 0; j < outHeight ; j++)
			{
				for ( i = 0; i < outWidth ; i++)
				{ 
					double x = 1.0*i / cgt.Zoom;
					double y = 1.0*j / cgt.Zoom;

					int x1, x2, y1, y2;//原图中映射点周围四个点的坐标

					x1 = (int)x;//左x
					x2 = x1 + 1;//右x					
					y1 = (int)y;//上y
					y2 = y1 + 1;//下y
					/*
					  x1、y1始终不会越界
					  x2、y2可能越界
					  因此须对x2、y2越界的情况单独讨论
					 */

					BYTE clr1, clr2, clr3, clr4;
					double u, v;
					u = x - x1;
					v = y - y1;
					
					if (i == outWidth - 1&& j== outHeight-1)//右下顶点
						pBits[j*outWidth + i] = pOldBits[y1*inWidth + inWidth - 1];
					else if(i==outWidth-1)//第一列除右下顶点部分
						{
							clr1 = pOldBits[y1*inWidth + x1];//左上
							clr3 = pOldBits[y2*inWidth + x1];//左下
							pBits[j*outWidth + i] = (BYTE)clr1 * (1 - v) + clr3 * v;
						}			
					else if (j == outHeight - 1)//最后一行除右下顶点部分
					{
							clr1 = pOldBits[y1*inWidth + x1];//左上
							clr2 = pOldBits[y1*inWidth + x2];//右上

							pBits[j*outWidth + i] = (BYTE)(clr1 * (1 - u) + clr2 * u);
					}
					else//其他部分
					{	
							clr1 = pOldBits[y1*inWidth + x1];//左上
							clr2 = pOldBits[y1*inWidth + x2];//右上
							clr3 = pOldBits[y2*inWidth + x1];//左下
							clr4 = pOldBits[y2*inWidth + x2];//右下

							pBits[j*outWidth + i] = (BYTE)((u*clr2 + (1 - u)*clr1)*(1 - v) + (u*clr3 + (1 - u)*clr4)*v);					
					}//end else					
				}//for(i = 0 ……)
			}//for(j = 0 ……)	

			Invalidate();
			delete pOldBits;//删除零时分配内存
			return;

		}	//结束m_pBits=8判定	

		
			
		if (pDoc->m_nColorBits == 24)
			{
				pOldBits = new unsigned char[inSize * 3];
					if (pOldBits == NULL)
						return;

				memcpy(pOldBits, pBits, inSize * 3);//把原图像中的数据拷贝到pOldBits里

				delete[] pBits;

				pBits = new unsigned char[outSize * 3];
				
				if (pBits == NULL)
					return;
			
				pDoc->m_pBits = pBits;
				memset(pBits, 0, outSize * 3);

				for (int k = 0; k < 3; k++)
					{
						for (j = 0; j < outHeight; j++)
								{
									for (i = 0; i < outWidth; i++)
										{
											double x = 1.0*i / cgt.Zoom;
											double y = 1.0*j / cgt.Zoom;

											int x1, x2, y1, y2;//原图中映射点周围四个点的坐标

											x1 = (int)x;//左x
											x2 = x1 + 1;//右x					
											y1 = (int)y;//上y
											y2 = y1 + 1;//下y

											BYTE clr1, clr2, clr3, clr4;
											double u, v;
											u = x - x1;
											v = y - y1;

											if (i == outWidth - 1 && j == outHeight - 1)//右下顶点
												pBits[(j*outWidth + i) * 3 + k] = pOldBits[(y1*inWidth + inWidth - 1) * 3 + k];
											else if (i == outWidth - 1)//最后一列除右下顶点部分
												{
													clr1 = pOldBits[(y1*inWidth + x1) * 3 + k];//左上
													clr3 = pOldBits[(y2*inWidth + x1) * 3 + k];//左下
													pBits[(j*outWidth + i) * 3 + k] = (BYTE)(clr1 * (1 - v) + clr3 * v);
												}
											else if (j == outHeight - 1)//最后一行除右下顶点部分
												{
													clr1 = pOldBits[(y1*inWidth + x1) * 3 + k];//左上
													clr2 = pOldBits[(y1*inWidth + x2) * 3 + k];//右上
													pBits[(j*outWidth + i) * 3 + k] = (BYTE)(clr1 * (1 - u) + clr2 * u);
												}
											else//其他部分
												{
													clr1 = pOldBits[(y1*inWidth + x1) * 3 + k];//左上
													clr2 = pOldBits[(y1*inWidth + x2) * 3 + k];//右上
													clr3 = pOldBits[(y2*inWidth + x1) * 3 + k];//左下
													clr4 = pOldBits[(y2*inWidth + x2) * 3 + k];//右下

													pBits[(j*outWidth + i) * 3 + k] = (BYTE)((u*clr2 + (1 - u)*clr1)*(1 - v) + (u*clr3 + (1 - u)*clr4)*v);
												}//end else
									}//for(i = 0 ……)
						}//for(j = 0 ……)		
				}	//三重循环分别处理三个分量		
					Invalidate();
					delete pOldBits;//删除零时分配内存
					return;
		}//结束m_pBits=24判定
	}//DoModal						
	else
		return;
}

运行一下看看(又是辣个熟悉的女人)
在这里插入图片描述
  放大1.5倍后:
在这里插入图片描述在这里插入图片描述
  利用双线性插值法完成对话框图像缩放应用程序完成!
  如有错漏,恳请指正!

没有更多推荐了,返回首页