精华内容
下载资源
问答
  • 1. tf.image.resize_and_crop(net, bbox, 256, [14, 14], name) # 根据bboxy1,x1,y2,x2获得net中位置,将其转换为14*14,因此为[14, 14, 512], 256表示转换个数,最后维度为[256, 14, 14, 512] 参数说明:...

    1. tf.image.resize_and_crop(net, bbox, 256, [14, 14], name)  # 根据bbox的y1,x1,y2,x2获得net中的位置,将其转换为14*14,因此为[14, 14, 512], 256表示转换的个数,最后的维度为[256, 14, 14, 512]

    参数说明:net表示输入的卷积层,bbox表示y1,x1,y2, x2的比例,256表示转换成多少个,[14, 14]表示转换的卷积,name表示名字

    2. tf.slice(x, [0, 2], [-1, 1])  # 对x进行切片操作,[0, 2]表示0表示行,2表示列,[-1, 1]表示切片的范围,这里是所有数字

    import tensorflow as tf
    
    sess = tf.Session()
    x = np.array([[1, 2, 3, 4],
                  [2, 3, 4, 5]])
    c = tf.squeeze(tf.slice(x, [1, 3], [-1, 1]))
    print(sess.run(c))

    3.x.argsort()[::-1] 将x进行从大到小的排序,返回的是其索引值

    x = np.array([5, 2, 3, 4])
    
    c = x.argsort()[::-1]
    print(c)

    4. np.empty((5,), dtype=np.float32) 生成空矩阵,这里可以用于生成标签值

    参数说明: (5, ) 表示维度,np.float32表示数据类型

    x = np.array([0.1, 0.3, 0.15, 0.5, 0.6])
    label = np.empty((5, ), dtype=np.float)
    label.fill(-1)
    label[x > 0.2] = 1
    print(label)

    5. np.meshgrid(xx, yy) 生成二维的数据,

    参数说明:xx为np.arange(0, 10)这样生成的数据

    xx = np.arange(0, 3)
    yy = np.arange(0, 3)
    xx, yy = np.meshgrid(xx, yy)
    print(xx)
    print(yy)
    ##
    xx = [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
    yy = [[0, 0, 0], [1, 1, 1], [2, 2, 2]]

    二维的位置数据为第一个位置为0,1,即xx[0][0]和 yy[0][0]

    6. np.where(x>1)[0] # 获得x大于1的索引值,[0]表示取出数值

    x = np.array([0, 1, 2])
    print(np.where(x>1)[0])
    
    ## [2] 输出结果

    7. tf.gather(x, [0, 3, 5]) 从x中取出索引值为[0, 3, 5]的三个数

    参数说明:x表示代取数,[0, 3, 5]表示索引值

    import tensorflow as tf
    
    sess = tf.Session()
    
    x = np.arange(0, 10)
    c = tf.gather(x, [0, 3, 5])
    print(sess.run(c))

    ### [0, 3, 5] 输出值

     

    参数说明:np.where表示索引值 

    faster-RCNN是在原有的faster-RCNN层的基础上加上了RPN层,RPN层主要是用于进行选框的获取

    基于上面这个图做一个说明:

    1.CNN层是采用训练好的VGG网络,

    2.VGG卷积后的结果输入到Region Proposal Network中用于进行,建议框的获取,文章中的建议框的个数是300 

    Classification loss 说明:根据anchor与Bouding_box真实框的重叠率,将重叠率大于0.7或者与目标框最大重叠率的anchor的标签设置为1,小于0.3设置为0,中间的设置为-1,训练获得是否存在物体

     

    Bouding-box regression loss : anchor框与真实框的回归值差,即 这里主要是为了获得选框的调整系数

    dx = (g_centx - e_centx) / ex_width   # (真实框中心x - 选框中心x)/ 选框的长

    dy = (g_centy - e_centy) / ex_center #(真实框中心y - 选框中心y) / 选框的宽

    dw = log(g_width / e_width)  # 真实框的长 / 选框的长

    dh = log(h_width / e_height) # 真实框的宽 / 选框的宽

    3. 将300个预选框输入,获得256个正负样本的边框位置

    classification,根据300个预选框与Bouding_box真实框重叠率,重叠率大于0.75,然后随机挑选出不高于0.25*256个正样本的标签,即2,6,8这种实际的物体标签值,重叠率较小的标签值为0。

    Bouding-box regression loss : 256个正负样本框与真实框的回归值差,这里同样获得的是调整系数

     

    4. 计算256个正负样本框在原始框中的比例, 使用cv2.image.crop_and_resize() 将VGG输出的网络,都转换为[256, 14, 14, 512]的输出结果,这一步被称为ROI pooling

    5.将256, 14, 14, 521 接全连接层,最终的全连接层,用于进行label 和 regression的预测

     

    代码说明:由于代码量较大,我对代码的思路做一个简要说明:

    第一步:主要是获得图片的信息,如图片的label,边框的位置信息,图片的名称

    第二步:模型的构建

                  第一步:构建net层,这里使用的是已经训练好的VGG16的卷积层

     

                  第二步:构建rpn,

                              第一步:构造选框anchor

                              第二步:将VGG16的卷积层经过一个3*3,在经过1*1,输出rpn_cls_score即得分值,输出rpn_bbox_pred即边框的调整比例

     

                  第三步:建立proposals

                             第一步:获得300个经过边框调整的proposals

                                    第一步:使用上面获得的rpn_bbox_pred对anchor进行调整获得proposal

                                    第二步:对得分socre进行从大到小的排序,获得前1200索引,根据索引重新组合proposal和score

                                    第三步:使用nms,去除重叠率大于0.75的边框值索引,然后取前300个proposal和score

                            第二步:构造训练rpn的cls的label 和 rpn_bbox 的label

                                   第一步:筛选边界内的anchor值

                                   第二步:将构建256个anchor与真实框重叠率大于0.75的标签设置为1,真实框重叠率小于0.3设置为0,剩下的设置为-1 

                                   第三步:将边界内的anchor与真实边框做差异分析,求比例,作为rpn_bbox的label                                          

                                                  dx = (g_centx - e_centx) / ex_width   # (真实框中心x - 选框中心x)/ 选框的长

                                                  dy = (g_centy - e_centy) / ex_center #(真实框中心y - 选框中心y) / 选框的宽

                                                  dw = log(g_width / e_width)  # 真实框的长 / 选框的长

                                                  dh = log(h_width / e_height) # 真实框的宽 / 选框的宽

                            第三步:将300个proposal预选框输入,构造最终proposal训练的cls和proposal_bbox的label,同时输出256个正负样本的边框值

                                    第一步:将真实框与预选框做重叠率分析,获得每个预选框最大的真实框的索引,构造预选框的标签为最大真实框索引

                                    第二步:获得预选框与真实框重叠率大于0.75的预选框,但是预选框的值不大于256*0.25,将小于0.5和大于0.1的标签设置为0,做proposal_cls的label

                                    第三步:将256正负样本的边框与真实框做差异分析,求比例,作为proposal_bbox的label

                                    第四步:返回256个的rios,x1,y1,x2,y2 

     

                   第四步:    构建预测prediction,对256的边框输入做最终的类别判别和边框调整的预测

                                  第一步:使用roi pool,使用x1 / width, x2/width, y1/height, y2/height获得比例用于获得部分卷积层,使用tf.image.resize_and_crop()每个边框调整后的卷积层,输入为256, 14, 14, 512, 然后使用池化层,输出的维度为256, 7, 7, 512

                                  第二步:将输出的结果进行维度变化,适合进行全连接操作,接上3层全连接层,最后一层接输出层,一个输出为cls_score, 一个输出为bbox_pred 

                    

                  第五步: 构建损失值函数,将上述的四个损失值进行加和

                  

                  第六步:进行模型的训练操作

     

    1.anchor框的生成,由于经过了四次pool,因此倍数相差16倍,构造16*16的面积,然后与倍数相除,求平均值,然后根据倍数获得w和h的值,然后根据scale,来增加

    w和h的值,使用np.meshgrid生成16*16的网格坐标,将anchor与网格坐标进行相加获得最终的anchor值

    代码:

    # 用于生成矩形框anchor
    def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
                         scales=2 ** np.arange(3, 6)):
        """
        Generate anchor (reference) windows by enumerating aspect ratios X
        scales wrt a reference (0, 0, 15, 15) window.
        """
        # 每个anchor对应的base_anchor为0, 0, 15, 15
        base_anchor = np.array([1, 1, base_size, base_size]) - 1
        ratio_anchors = _ratio_enum(base_anchor, ratios)
        # scales等于[8, 16, 32]
        anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
                             for i in range(ratio_anchors.shape[0])])
        return anchors
    
    
    def _whctrs(anchor):
        """
        Return width, height, x center, and y center for an anchor (window).
        """
        # anchor框的w
        w = anchor[2] - anchor[0] + 1
        # anchor框的h
        h = anchor[3] - anchor[1] + 1
        # anchor框的中心位置x
        x_ctr = anchor[0] + 0.5 * (w - 1)
        # anchor框的中心位置y
        y_ctr = anchor[1] + 0.5 * (h - 1)
        return w, h, x_ctr, y_ctr
    
    
    def _mkanchors(ws, hs, x_ctr, y_ctr):
        """
        Given a vector of widths (ws) and heights (hs) around a center
        (x_ctr, y_ctr), output a set of anchors (windows).
        """
        # 创建achor, 大小为
        ws = ws[:, np.newaxis]
        hs = hs[:, np.newaxis]
        anchors = np.hstack((x_ctr - 0.5 * (ws - 1),
                             y_ctr - 0.5 * (hs - 1),
                             x_ctr + 0.5 * (ws - 1),
                             y_ctr + 0.5 * (hs - 1)))
        return anchors
    
    
    def _ratio_enum(anchor, ratios):
        """
        Enumerate a set of anchors for each aspect ratio wrt an anchor.
        """
        # 根据x1,y1,x2,y2的坐标生成w, h, x_ctr, y_ctr
        w, h, x_ctr, y_ctr = _whctrs(anchor)
        # 根据w * h 获得当前anchor的面积
        size = w * h
        # 使用ratio扩大面积
        size_ratios = size / ratios
        # 对面积求平均作为ws
        ws = np.round(np.sqrt(size_ratios))
        # 根据比例获得hs的大小
        hs = np.round(ws * ratios)
        # 构造anchors值,根据圆心的位置,重新获得x1,x2,y1,y2
        anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
        return anchors
    
    
    def _scale_enum(anchor, scales):
        """
        Enumerate a set of anchors for each scale wrt an anchor.
        """
        # 根据anchor,获得中心点的位置
        w, h, x_ctr, y_ctr = _whctrs(anchor)
        # 将w和h乘以scale的倍数
        ws = w * scales
        hs = h * scales
        # 根据ws,hs,x_ctr,y_tr获得anchor的x1,y1,x2,y2
        anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
        return anchors

     

    2.nms非极大值抑制,这里需要对score进行排序,然后从第一个开始,获得第一个与其他的roi,使用np.where找出小于阈值的roi值,重新构造索引值

    import numpy as np
    
    def py_cpu_nms(dets, thresh):
        """Pure Python NMS baseline."""
        # 获得最终预测框的x1, y1, x2, y2
        x1 = dets[:, 0]
        y1 = dets[:, 1]
        x2 = dets[:, 2]
        y2 = dets[:, 3]
        # 获得每个框的得分值
        scores = dets[:, 4]
        # 获得面积值
        areas = (x2 - x1 + 1) * (y2 - y1 + 1)
        # 对得分进行一个排序
        order = scores.argsort()[::-1]
       # 构造用于存储序号
        keep = []
        while order.size > 0:
            # 获得得分值最大的值
            i = order[0]
            # 添加到keep中
            keep.append(i)
            # 两两矩阵,获得与x1[i]做对比,取较大值
            xx1 = np.maximum(x1[i], x1[order[1:]])
            # 两两矩阵,获得与y1[i]做对比,取较大值
            yy1 = np.maximum(y1[i], y1[order[1:]])
            # 两两矩阵,获得与x2[i]做对比, 取较小值
            xx2 = np.minimum(x2[i], x2[order[1:]])
            # 两两矩阵,获得与y2[i]做对比,取较小值
            yy2 = np.minimum(y2[i], y2[order[1:]])
            # 构造交叉部分的面积乘积
            w = np.maximum(0.0, xx2 - xx1 + 1)
            h = np.maximum(0.0, yy2 - yy1 + 1)
            inter = w * h
            # 使用交叉面积 / (原始面积 + 原始面积1 - 交叉面积)
            ovr = inter / (areas[i] + areas[order[1:]] - inter)
            # 重新组合获得小于thresh的order值
            inds = np.where(ovr <= thresh)[0]
            order = order[inds + 1]
    
        return keep

     

    3. ROI_POOl操作,输入的为256个边框的位置,使用图片的height和width,对位置做比例化操作,然后使用tf.image.resize_and_crop(conv, boxs, 256, [14, 14]), 

    将特征图上的对应位置转换为(256, 14, 14, 512)的维度

        def _crop_pool_layer(self, bottom, rois, name):
            # 对输入的矩形框进行维度的压缩,即rio-pool
            with tf.variable_scope(name):
                # 标签值
                batch_ids = tf.squeeze(tf.slice(rois, [0, 0], [-1, 1], name="batch_id"), [1])
                # Get the normalized coordinates of bboxes, 卷积层的维度
                bottom_shape = tf.shape(bottom)
                height = (tf.to_float(bottom_shape[1]) - 1.) * np.float32(self._feat_stride[0])
                width = (tf.to_float(bottom_shape[2]) - 1.) * np.float32(self._feat_stride[0])
                # 获得x1,y1,x2,y2在图像上的比例
                x1 = tf.slice(rois, [0, 1], [-1, 1], name="x1") / width
                y1 = tf.slice(rois, [0, 2], [-1, 1], name="y1") / height
                x2 = tf.slice(rois, [0, 3], [-1, 1], name="x2") / width
                y2 = tf.slice(rois, [0, 4], [-1, 1], name="y2") / height
                # Won't be backpropagated to rois anyway, but to save time
                bboxes = tf.stop_gradient(tf.concat([y1, x1, y2, x2], axis=1))
                # 7 * 2 = 14
                pre_pool_size = cfg.FLAGS.roi_pooling_size * 2
                # 每个特征图中取出x1,x2,y1,y2重构为14*14,一共有512个特征图,一共有256个框
                crops = tf.image.crop_and_resize(bottom, bboxes, tf.to_int32(batch_ids), [pre_pool_size, pre_pool_size], name="crops")
            # 进行一次池化操作
            return slim.max_pool2d(crops, [2, 2], padding='SAME')

     

     

     

                               

                                    

       

     

                            

    转载于:https://www.cnblogs.com/my-love-is-python/p/10651095.html

    展开全文
  • Thumbnailator类库:size() API方法 或者是使用 java awt 类库: BufferedImage类,ImageIO输出图片, Graphics绘制图片 1,根据缩略比例计算缩略图高度和...2,使用Image获得原图缩放版本 3,使用ImageIO...

    Thumbnailator类库:  size() API方法

    或者是使用 java awt 类库:

    BufferedImage类,ImageIO输出图片, Graphics绘制图片

    1,根据缩略比例计算缩略图高度和宽度,

    2,使用Image类获得原图的缩放版本

    3,使用ImageIO类保存缩略图

    视频地址: 慕课网的Java视频: http://www.imooc.com/learn/567

    源码地址: https://github.com/nihaoxiaosong/thumbnail

     

    转载于:https://my.oschina.net/ouminzy/blog/713430

    展开全文
  • 使用Image类中open()方法从文件加载图像,使用其中size属性获得图像宽度和高度。 os模块中path.getsize ()方法可以获得文件大小,单位是字节B(1B=8Bit,1KB=1024B)。 picture=input("请输入图片名称...
  • 上次有同学问如何添加标尺,这次正好到这个内容了~~01设置像素与实际长度的比例关系很多时候,我们获得的图片尤其是非原始图片或者没有写入像素与实际长度关系,这个时候如果要对图片中的形状进行实际测量,比如实际...

    上次有同学问如何添加标尺,这次正好到这个内容了~~

    01设置像素与实际长度的比例关系

    很多时候,我们获得的图片尤其是非原始图片或者没有写入像素与实际长度关系,这个时候如果要对图片中的形状进行实际测量,比如实际长度、面积之类的测量,就需要知道图片像素与实际长度的比例关系。
    1、打开一张图片,左上角会告诉我们这张图片的长宽像素乘积;

    4d91d726c9cde5ea46927fe940692502.png

    2、先将图片适当放大(以便秒描绘直线),使用直线工具沿着图片标尺两端进行描绘;描绘的时候可以按住shift键,保证直线水平;下图为了展示方便,把描绘的红色直线稍微偏离了比例尺白线。

    bee6a1c159f4015df784e5cfba42e787.png

    3、Analyze-Set Scale,设置比例关系:

    4396441ed3104c155c18712a35467f2c.png
    Distance in pixels:刚刚描绘的直线长度为91.5 pixels,这个值不用设置,自动测量得到;
    • Known distance:描绘的直线所代表的实际长度,10;
    • Unit of length:设置单位为μm,按照比例尺下面的单位来设置;
    • 这样就得到了图片上面每一个像素所代表的实际长度,所以下面有Scale:9.15pixels/μm。有了这样的关系之后,我们利用Image J对位图以像素为单位进行测量或者计算的时候,就与实际长度联系起来了。
    • Global:对于所有打开的照片应用该比例关系。如果有同批次同镜头视野的多张照片,可以勾选此选项,一次性将所有照片中像素所对应的实际距离进行设置。

    4、点击OK之后,照片的大小将以实际长度55.64×40.87μm来表示,在后面括号内保留像素为单位的大小(500×374)。

    fb159ebf7ae29b12a9466801ab30bc95.png

    5、这时每个像素将代表一个实际距离。因此可以进行一些测量,比如利用魔棒工具配合容差(Tolerance)选择并测量右下角细胞的面积;面积测量具体见《选区和选区管理工具》、《角度测量、粒径测量和其他基础测量》两篇文章。

    ae24cead94804627907152aacba2c478.png

    这个细胞的面积就是157.915μm2

    b51b32756192a73a42f9a891995b69a8.png

    02 添加比例尺

    如果只有一张图片有比例尺,而其他同比例关系的图片没有比例尺,一般是同一拍照设备+同样视野倍数,那么可以为其他图片添加比例尺。

    注意:同比例关系的一批图片必定要有一张具有比例尺。

    1、在设置比例关系的时候勾选Global,比例关系就会被软件记住,可以直接应用到已经打开的图片上,或者新打开其他图片时询问是否应用这种比例关系;

    7e2adb7ed031ed3aad095477e654f67f.png

    新打开图片时,把第一个勾去掉即可应用同样的比例关系,新打开的图片见第2步的图片;

    62a2aea70ec07f1de9689081dad52b3e.png

    2、Analyze-Tools-Scale Bar,添加比例尺;

    c3ed969f55a41183f986b3970ed3c067.png

    里面的选项都很简单:

    • Width in μm:设置多长的比例尺。一般要求和之前的图片保持一致,这里设置为10μm即可,也可以随意设置;其他选项都是对比例尺和文字属性进行设置,比如比例尺线条宽度、字号、颜色、背景色、定位以及下面一些文本选项。都很简单,一看就会。
    • 一般不勾选Overlay,我们之前讲过Overlay是一种透明的悬浮图层,如果勾选会导致图片具有多个图层,还需要进行图层合并或者保存为没有图层的图片格式(不包括Tif格式),才会使得图片上面显示标尺文字。

    3、其中稍微有点难度的可能是对比例尺进行自由定位。在Location里面有个At Selection,在添加比例尺之前,先用矩形工具或直线工具,在图片上面需要添加标尺的地方建立一个选区,然后再添加比例尺,设置Width in μm,则最后比例尺会添加到指定的地方。

    8407faa649b8a67a5c9cddeb67f8a934.png

    4、如果同批次图片很多,可以使用宏记录器+批量操作进行。有兴趣的同学可以先自己摸索,后面会专门介绍如何进行批量操作。

    展开全文
  • 影像工具 该项目包含用于将横向图像与纵向图像分离脚本。 它还可以将它们调整为1920像素宽,而不会丢失其原始比例。 入门 这些说明将为您提供在本地计算机上...此项目已获得MIT许可证许可-有关详细信息,请参阅文件
  • java实现等比例缩略图

    2016-04-28 17:28:57
    方式二、Java AWT类图实现:根据缩略比例计算缩略图高度和宽度,使用Image获得原图缩放版本,使用ImageIO类保存缩略图---BufferedImage,ImageIO,Graphips 案例: springMVC搭建: web.xml Thumbrail ...

    方式一、Thumbnailator类库:size()API方法,

    方式二、Java AWT类图实现:根据缩略比例计算缩略图高度和宽度,使用Image类获得原图的缩放版本,使用ImageIO类保存缩略图---BufferedImage,ImageIO,Graphips

    案例:

    springMVC搭建:

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>Thumbrail</display-name>
      <servlet>
      	<servlet-name>springmvc</servlet-name>
      	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      	<init-param>
      		<param-name>contextConfigLocation</param-name>
      		<param-value>classpath:applicationContext-mvc.xml</param-value>
      	</init-param>
      	<load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
      	<servlet-name>springmvc</servlet-name>
      	<url-pattern>/</url-pattern>
      </servlet-mapping>
      
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    applicationContext-mvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    	http://www.springframework.org/schema/tx
    	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context-3.0.xsd
    	http://www.springframework.org/schema/mvc
    	http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    	">
    	<mvc:default-servlet-handler/>
    	<mvc:annotation-driven/>
    	<context:component-scan base-package="*"/>
    	<bean id="biewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolve">
    		<property name="prefix" value="/"/>
    		<property name="suffix" value=".jsp"/>
    		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    	</bean>
    	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    		<property name="defaultEncoding" value="utf-8"/>
    		<property name="maxUploadSize" value="10485760000"/>
    		<property name="maxInMemorySize" value="40960"/>
    	</bean>
    	
    	  </beans>
    index.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>上传文件</title>
    </head>
    <body>
    <div class="demo">
    	<div class="bheader">
    		<h2>---图片文件上传---</h2>
    	</div>
    	<div class="bbody">
    		<form id="upload_form" enctype="multipart/from-data" method="post" action="${pageContext.request.contextPath}/thumbnail" >
    			<h2>请选择上传图片</h2>
    			<div>
    				<input type="file" name="image" id="image"/>
    				<input type="submit" value="上传"/>
    			</div>
    		</form>
    	</div>
    </div>
    </body>
    </html>
    thumbnailAction.java

    package com.thumbnail;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    import org.springframework.web.portlet.ModelAndView;
    
    @Controller
    @RequestMapping("/")
    public class ThumbnailAction {
    	private UploadService u ;
    	private ThumbnailService t;
    	//springmvc会将用户提交的文件信息封装成为CommonsMultipartFile文件类型:方法的参数名称file和文件中提交的文件名称image是不对应的,需要注解下,让其统一
    	@RequestMapping(value="/thumbnail",method=RequestMethod.POST)
    	public ModelAndView thumbnail(@RequestParam("image")CommonsMultipartFile file,HttpSession session) throws Exception{
    		String uploadPath = "/images";//缩略图上传目录--相对路径
    		String realUploadPath = session.getServletContext().getRealPath(uploadPath);//得到绝对路径
    		
    		String imagerUrl = u.uploadImage(file, uploadPath, realUploadPath);;//原图路径
    		String thumImageUrl = t.thumbnail(file, uploadPath, realUploadPath);//缩略图路径
    		
    		ModelAndView ret = new ModelAndView();
    		ret.addObject("imageURL",imagerUrl);
    		ret.addObject("thumImageURL",thumImageUrl);
    		
    		ret.setViewName("thumbnail");
    		return ret;
    	}
    	@Autowired
    	public void setU(UploadService u) {
    		this.u = u;
    	}
    	@Autowired
    	public void setT(ThumbnailService t) {
    		this.t = t;
    	}
    }
    
    uploadService.java

    package com.thumbnail;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    /**
     * 文件上传实现
     * @author Administrator
     *
     */
    @Service
    public class UploadService {
    	
    	public String uploadImage(CommonsMultipartFile file,String uploadPath,String realUploadPath){
    		InputStream is = null;
    		OutputStream out = null;
    		try {
    			is = file.getInputStream();//得到文件流
    			String des = realUploadPath + "/" +file.getOriginalFilename();
    			out = new FileOutputStream(des);//得到输出流
    			
    			byte[] buffer = new byte[1024];
    			int len = 0;
    			while((len = is.read(buffer)) > 0){
    				out.write(buffer);
    			}
    		} catch (Exception e) {
    			// TODO: handle exception
    		}finally{
    			if(is != null){
    				try {
    					is.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    			if(out != null){
    				try {
    					out.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		
    		return uploadPath+"/"+file.getOriginalFilename();
    	}
    }
    
    ThumbnailService.java

    package com.thumbnail;
    
    import net.coobird.thumbnailator.Thumbnails;
    
    import org.springframework.stereotype.Service;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    
    /**
     * 缩略图服务类
     * @author Administrator
     *
     */
    @Service
    public class ThumbnailService {
    	public static final int WIDTH = 100;
    	public static final int HEIGHT = 100;
    	
    	public String thumbnail(CommonsMultipartFile file, String uploadPath,String realUploadPath){
    		try {
    			String des = realUploadPath + "thum_" + file.getOriginalFilename();
    			Thumbnails.of(file.getInputStream()).size(WIDTH, HEIGHT).toFile(des);//生成缩略图
    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    		
    		return uploadPath + "/thum_" + file.getOriginalFilename();
    	}
    }
    
    thumbnail.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>操作结果</title>
    </head>
    <body>
    <h4>图片信息</h4>
    <hr />
    <table width="200">
    	<tr>
    		<td width="50%" align="center"><img src="${pageContext.request.contextPath }${imageURL}" width="500"></td>
    		<td width="50%" align="center"><img src="${pageContext.request.contextPath }${thumbImageURL}" /></td>
    	</tr>
    </table>
    <hr/>
    <a href="${pageContext.request.contextPath }">返回</a>
    </body>
    </html>








    展开全文
  • 2.实现图片等比例缩略图生成,方式及相关工具介绍:(1)Thumbnailator类库(推荐)工具:size()API方法(2)Java AWT类库(复杂)根据缩略比例计算缩略图高度贺宽度,使用Image获得原图缩放版本,使用ImageIO类保存缩略...
  • dedecms缩略图按大小比例缩小裁剪

    千次阅读 2016-09-06 12:02:04
    修改如下: 打开/includes/helpers/image.helper.php文件 //缩图片自动生成函数,来源支持bmp、gif、jpg、png ...//获得GD版本之间代码 用如下代码覆盖(大家请注意备份)。 function ImageResize($srcFile
  • 上次有同学问如何添加标尺,这次正好到这个内容了~~01设置像素与实际长度的比例关系很多时候,我们获得的图片尤其是非原始图片或者没有写入像素与实际长度关系,这个时候如果要对图片中的形状进行实际测量,比如实际...
  • import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.... public class ImageSizeCol {//获得Jsp自定义标签中的的属性width和height。 public String getJspT
  • 没有躲过坑--意想不到除数为零

    千次阅读 2015-11-22 22:23:43
    工程中有这样一个需求,需要获得一张图片width和height,然后等比例的显示这张图片。首先是获得得到一张图片路径,然后计算出他width和height,然后计算:int resize_width = 160; int resize_height = 160; ...
  • Android图片二次采样

    2019-04-25 21:03:32
    为什么要进行二次采样? 在手机上显示一张分辨率特别大图片和显示一张分辨率小...第一次采样我主要是想要获得图片压缩比例,假如说我有一张图片是200*200,那么我想把这张图片缩略图显示在一个50*50的Image...
  • 原理大概就是: 1、先将图片file文件转成baseURL 2、创建一个image标签去接收文件获取图片宽高和比例。 3、创建canvas画布设置画布大小。 4、将图片绘制到canvas上面。 5、对canvas进行压缩处理,获得...
  • image020.gif信号各乘一个比例因子使二者幅度不同然后再加入噪声)对时差估计影响,并给出降低影响方法。(如有兴趣,可继续讨论在估计时差时所采用信号长度不同对时差估计影响)。6)在设计时差法超声波流量...
  • 根据BTCA的属性,仔细选择每个块的有效截断点,以优化速率失真的比例,从而获得更高的压缩比、更低的内存要求和随机访问性能。由于没有任何熵编码,所提出的方法简单快速,非常适合于空间设备。对三个遥感图像集进行...
  • 这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好用户体验。通常情况下,平常见得比较多是这种写法。(1)多张图片通过实例化Image对象...
  • 2020-04-15

    2020-04-15 01:51:19
    from PIL import Image#引入PIL库中的Image类import os#引入os 模块12使用Image类中open()方法从文件加载图像,使用其中size属性获得图像宽度和高度。os模块中path.getsize ()方法可以获得文件大小,单位...
  • 图片预加载对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好用户体验。我们知道在 Web 页面中实现图片预加载其实很简单,通常做法是...
  • 图片处理类

    2019-10-03 01:28:05
    获得图片宽,高,后缀函数,有等比例缩略图函数,有添加水印函数,有产生验证码函数 <?php defined('ACC')||exit('无权访问'); //图片处理类 class ImageTool{ //imageInfo分析图片信息 ...
  • 在SWT中显示图片并调整大小

    千次阅读 2018-01-06 14:34:29
    如何在SWT中显示图片并调整大小呢?在swt中要显示图片是不能改变大小,比如我们用backgroundimage。但是有时我需要把我们想要显示图片按一定比例自动适应...Image有两种获得图片文件方法如: final Dis
  • SWT中显示图片

    千次阅读 2012-06-10 15:17:03
    如何在SWT中显示图片并调整大小呢?在swt中要显示图片是不能改变大小,比如我们用backgroundimage。但是有时我需要把我们想要显示图片按一定比例自动...Image有两种获得图片文件方法如: final Display displ
  • 图片缩放

    2017-07-03 21:05:11
    Zoom:=Image1.Width/Max(bmp.... //获得比例值    W:=Trunc(bmp.Width*Zoom);  H:=Trunc(bmp.Height*Zoom);  //居中显示缩小后图片  Image1.Canvas.StretchDraw(Rect(Trunc((Image1.width-W)/2),Trunc
  • 图片预先加载到浏览器中,这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览网站内容时获得更好用户体验。示例代码:function loadImage(url, callback) { ...
  • 第一种,推荐方式,调用api方法,Thumbnailator类库来实现。只需要我们提供参数即可。...使用image获得原图缩放版本  3.使用image IO 类保存缩略图,并从服务器路径获得 注意:第二种比较复杂
  • 图片预加载

    2016-10-31 15:49:00
    图片预先加载到浏览器中,这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览网站内容时获得更好用户体验。示例代码:function loadImage(url, callback) {var...
  • 由于 canvas 绘制图片像素直接由 Canvas 本身大小决定,此处通过同比例放大整个画布来实现对最后生成图片大小调节。 <painter customStyle='position: absolute; left: -9999rpx;' palette="{{template}}" ...
  • 功能:创建新分区,新分区需要获得空间 ,向导可以将磁盘中其他分区调小而获得自由空间。创建备份分区,让你创建一个专用备份分区来存放你个人数据文件副本。例如,一个备份分区可以用来存放 PowerQuest...
  • }编辑状态保存一篇手帐包含组件类型包括 sticker(软件自带贴纸)、image(用户上传图片)和 text(自定义文字)三种,全部保存在一个如下格式 json 对象中,每个独立组件都包含了一个不重复 id 以及...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

获得image的比例