`
hereson
  • 浏览: 1454535 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

使用 cStringIO.StringIO 代替临时文件

 
阅读更多
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-#import os
-#import sys
- #将 lib 目录添加到系统路径,以便导入 lib 目录下的模块
-#app_root = os.path.dirname(__file__)
-#sys.path.insert(0, os.path.join(app_root, 'lib'))
-
-#if sys.getdefaultencoding() != 'utf-8':
-    #reload(sys)
-    #sys.setdefaultencoding('utf-8')
-
-import tempfile
-import StringIO
+import cStringIO
 import urllib
 import web
 import qrcode
 @@ -42,7 +31,6 @@ def GET(self):
         return render.index()
 
 
-# TODO 返回具体错误信息
 class QR(object):
     """处理传来的数据并显示 QR Code 二维码图片
     """
 @@ -51,7 +39,7 @@ def handle_parameter(self, chl, chld, chs):
         """
         if len(chl) > 2953:  # 最大容量
             raise web.badrequest()
-        chld = chld.upper()  # 转换为大写字母
+        chld = chld.upper()
         # chld 是非必需参数,有默认值
         if not chld:
             chld = 'M|4'
 @@ -71,7 +59,7 @@ def handle_parameter(self, chl, chld, chs):
             border = 4
 
         try:
-            chs = chs.lower()  # 转换为小写字母
+            chs = chs.lower()
             size = tuple([int(i) for i in chs.split('x')])
         except:
             raise web.badrequest()
 @@ -139,9 +127,6 @@ def handle_parameter(self, chl, chld, chs):
                 raise web.badrequest()
             error_correction = qrcode.constants.ERROR_CORRECT_H
 
-        # print len(chl)
-        # print version
-        # print size, border
         # 根据 python-qrcode 源码、square_size 及 version 参数求 box_size
         box_size = square_size / ((version * 4 + 17) + border * 2)
         # print box_size
 @@ -181,30 +166,27 @@ def show_image(self, **args):
                 raise web.internalerror()
 
         # im.show()
-        # 将生成的二维码图片保存到临时文件中,用于下面的缩放处理
-        tempfile.tempdir = 'temp'
-        temp_img = tempfile.TemporaryFile()
+        # 将生成的二维码图片保存到内存中,用于下面的缩放处理
+        temp_img = cStringIO.StringIO()
         im.save(temp_img, 'png')
-        temp_img.seek(0)
-        img_data = temp_img.read()  # 获取图片内容
-        im = Image.open(StringIO.StringIO(img_data))
-        x, y = im.size
-        rx, ry = size
-        # TODO 缩放太小不能识别则显示空白,判断图片清晰度
+        img_data = temp_img.getvalue()  # 获取图片内容
+        im = Image.open(cStringIO.StringIO(img_data))
+        x, y = im.size  # 生成的二维码图片大小
+        rx, ry = size  # 用户请求的图片大小
+
         new_im = Image.new("1", (rx, ry), "white")
-        # 将二维码图片粘贴到空白图片中,保持二维码图片居中
+        # 将二维码图片粘贴到空白图片中并保持二维码图片居中
         paste_size = ((rx - x) / 2, (ry - y) / 2, (rx - x) / 2 + x,
                       (ry - y) / 2 + y)  # 粘贴位置
-        new_im.paste(im, paste_size)
-        temp_img.close()  # 删除临时文件
+        new_im.paste(im, paste_size)  # 若位置全为负值则缩放并填充整个目标图片
 
-        temp_img = tempfile.TemporaryFile()
+        temp_img.write('')
         new_im.save(temp_img, 'png')  # 保存粘贴好的图片
-        temp_img.seek(0)
-        new_im_data = temp_img.read()
+        new_im_data = temp_img.getvalue()
         # 图片 MIME 类型
         MIME = ImageMIME().get_image_type(new_im_data)
-        temp_img.close()
+
+        temp_img.close()  # 释放内存
         return (MIME, new_im_data)
 
     def GET(self):

 

分享到:
评论

相关推荐

    python使用cStringIO实现临时内存文件访问的方法

    f = cStringIO.StringIO(res.read()) f 是一个文件对象, 它和:f = open(‘c:/1.jpg’,’rw’) 打开的文件一样 可以向操作本地文件一样对内存文件进行读写 希望本文所述对大家的Python程序设计有所帮助。

    python模块之StringIO使用示例

    这在很多情况下非常有用,例如,在需要进行文件操作的代码中临时使用字符串代替文件,或是在处理文本数据时无需实际在磁盘上创建文件。 StringIO模块通常用于以下场景: 1. 作为字符串的缓存,当你需要处理一些...

    python从网络读取图片并直接进行处理的方法

    本文实例讲述了python从网络读取图片并直接进行处理的方法。分享给大家供大家参考。具体实现方法如下: ... file = cStringIO.StringIO(urllib2.urlopen(url).read()) img = Image.open(file) im

    Python中暂存上传图片的方法

     buf = cStringIO.StringIO()  image.save(buf, image.format,quality=75)  data = buf.getvalue()  a = u.writeFile(‘/this/logo.jpg’,data,True) 应用在 使用django,用户上传图片后,将图片转存到...

    Python标准库(Python Standard Library)

    1. 核心模块 o 1.1. 介绍 o 1.2. _ _builtin_ _ 模块 o 1.3.... cStringIO 模块 o 2.7. mmap 模块 3. 线程和进程 o 3.1. 概览 o 3.2. threading 模块 o 3.3. Queue 模块 o 3.4. thread 模块 o 3.5. comm

    使用Python的urllib2模块处理url和图片的技巧两则

    这可以通过将远程图片的响应内容读取到内存中的一个流对象(如`cStringIO.StringIO`)来实现,然后使用`PIL`(Python Imaging Library)的`Image`模块解析这个流对象,从而获取图片的格式、尺寸和模式。 以下是获取...

    Python实现获取本地及远程图片大小的方法示例

    然后,`cStringIO.StringIO(image_data)`将图片数据转换为一个可以像文件一样读写的内存对象。最后,`Image.open(tmpIm)`读取这个内存中的图片数据并返回一个Image对象,我们可以像处理本地图片那样获取其格式和尺寸...

    python django下载大的csv文件实现方法分析

    在上述代码中,`genCSV`是一个生成器函数,它负责将数据写入`cStringIO.StringIO`对象并逐块生成。`getContent`函数用于获取当前`StringIO`对象中的数据。在`StreamingHttpResponse`中,我们传入`genCSV`作为数据源...

    Python StringIO模块实现在内存缓冲区中读写数据

    s = StringIO.StringIO(“JGood is a handsome boy”) s.write(“JGood is a handsome boy \r\n”) s.write(‘okkkk中国’) s.seek(0) print s.read()   #最后4个字节 s.seek(-4, 2) print s.read()   #—-

    python标准库.pdf

    - `cStringIO.StringIO([string])`: 创建一个内存中的文本流。 **2.7 mmap模块** - **作用**:提供了内存映射文件的支持。 - **常见函数**: - `mmap.mmap(fd, length, tagname=None, access=mmap.ACCESS_READ, ...

    python模块详解

    2.5. StringIO 模块 2.6. cStringIO 模块 2.7. mmap 模块 2.8. UserDict 模块 2.9. UserList 模块 2.10. UserString 模块 2.11. traceback 模块 2.12. errno 模块 2.13. getopt 模块 2.14. getpass 模块 ...

    使用python读取csv文件快速插入数据库的实例

    output = cStringIO.StringIO() df.to_csv(output, sep='\t', index=False, header=False) output.getvalue() # 重置输出流的指针,以便从头开始读取 output.seek(0) # 获取数据库连接并创建游标 connection = ...

    Python实现批量读取图片并存入mongodb数据库的方法示例

    本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法...from cStringIO import StringIO from pymongo import MongoClient import gridfs import os import matplotlib.pyplot as plt import matplotlib.im

    Python实现将SQLite中的数据直接输出为CVS的方法示例

    self.queue = cStringIO.StringIO() self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.stream = f self.encoder = codecs.getincrementalencoder(encoding)() def writerow(self, row): ...

    最全的Jython学习资料:来自官网(二) 字符串模块

    在Jython中,字符串模块主要通过StringIO和cStringIO来实现类似文件的操作。StringIO模块提供了一个可以读写字符串缓冲区的类,就像是内存中的文件一样。cStringIO模块是StringIO的优化版,提供了更快的性能,但它是...

    Python实现淘宝秒杀聚划算抢购自动提醒

    3. **文件操作**:使用cStringIO.StringIO将网页内容转换为输入流,便于逐行读取。 4. **循环控制**:使用for循环遍历输入流中的每一行,判断是否含有特定的关键字(如商品状态信息)。 5. **条件判断**:使用if-...

Global site tag (gtag.js) - Google Analytics