def request(self, iri, method="GET", extra_headers=None, oauth_credentials=None, post_content=None): """Return a deferred that will be fired with a Response object.""" uri = self.iri_to_uri(iri) request = QNetworkRequest(QUrl(uri)) request.setSslConfiguration(self.ssl_config) headers = yield self.build_request_headers(uri, method, extra_headers, oauth_credentials) for key, value in headers.items(): request.setRawHeader(key, value) post_buffer = QBuffer() post_buffer.setData(post_content) try: result = yield self._perform_request(request, method, post_buffer) except ProxyUnauthorizedError as e: app_proxy = QNetworkProxy.applicationProxy() proxy_host = app_proxy.hostName() if app_proxy else "proxy server" got_creds = yield self.request_proxy_auth_credentials( proxy_host, self.proxy_retry) if got_creds: self.proxy_retry = True result = yield self.request(iri, method, extra_headers, oauth_credentials, post_content) else: excp = WebClientError('Proxy creds needed.', e) defer.returnValue(excp) defer.returnValue(result)
def render_to_bytes(self, url): """Renders the image into an object of type 'str'""" format = self.format # this may not be constant due to processEvents() image = self.render(url) qBuffer = QBuffer() image.save(qBuffer, format) return qBuffer.buffer().data()
def exportThumbnail(self, report_path, thumbpath, name, node, size=None): self.thumbnailer = Thumbnailer() if self.thumbnailer.isThumbnailable(node): pixmap = self.thumbnailer.generate(node, iconSize=256, frames=10, blocking=True) self.thumbnailer.unregister() if pixmap: try: exportPath = os.path.join(report_path, os.path.join(thumbpath, name)) array = QByteArray() qfile = QBuffer(array) qfile.open(QIODevice.ReadWrite) pixmap.save(qfile, 'JPG') qfile.seek(0) with open(exportPath, 'wb') as f: f.write(qfile.read(qfile.size())) qfile.close() return True except Exception as e: qfile.close() return False else: return False
def __init__(self): QWidget.__init__(self) self.tray = Tray(self) self.setMinimumSize(QSize(320, 200)) self.setWindowFlags(Qt.Popup | Qt.FramelessWindowHint) self.verticalLayout = QVBoxLayout(self) self.verticalLayout.setMargin(1) self.text = QTextBrowser(self) self.text.setReadOnly(True) self.text.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.text.setOpenExternalLinks(True) self.verticalLayout.addWidget(self.text) self.text.textChanged.connect(self.on_text_changed) self.notify = Notify(self) self.movie = QMovie() dev = QBuffer() dev.setData(QByteArray.fromBase64(CHECK_IMAGE)) dev.open(QBuffer.ReadOnly) dev.setParent(self.movie) self.movie.setDevice(dev) self.movie.frameChanged.connect(self.on_frame_changed) self.realized = False self.show()
def store_data(self, id, data): directory = ApplicationData.get('images') filename = os.path.join(directory, id + '.png') makedirs(directory) pixmap = QPixmap() if data is not None and pixmap.loadFromData(data): image_size = pixmap.size() if image_size.width() > self.max_size or image_size.height( ) > self.max_size: pixmap = pixmap.scaled(self.max_size, self.max_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) if imghdr.what(None, data) != 'png' or pixmap.size() != image_size: buffer = QBuffer() pixmap.save(buffer, 'png') data = str(buffer.data()) with open(filename, 'wb') as f: f.write(data) icon = QIcon(pixmap) icon.filename = filename icon.content = data else: unlink(filename) icon = None self.iconmap[id] = icon return icon
def xmlbuffer(self): queryimpl = QXmlQuery(QXmlQuery.XQuery10) #merge params from xquerynames and query path arguments params = copy.deepcopy(self.xquerynames) for name,value in self._queryparams.iteritems(): params.append([name,value]) #push values into external variable names in xquery for item in params: if len(item)==3 : # item has namespace (name,value,namespace) = item qname = QXmlName(queryimpl.namePool(), name, namespace) else: (name,value) = item qname = QXmlName(queryimpl.namePool(), name) qvalue = QXmlItem(value) queryimpl.bindVariable(qname,qvalue) #bind focus if available if(self.focuspath != None): queryimpl.setFocus(QUrl.fromLocalFile(self.focuspath)) queryimpl.setQuery(self.querysource) buf = QBuffer() buf.open(QBuffer.ReadWrite) queryimpl.evaluateTo(buf) buf.close() data = buf.data() return data
def store_file(self, id, file): directory = ApplicationData.get('images') filename = os.path.join(directory, id + '.png') if filename == os.path.normpath(file): return self.iconmap.get(id, None) makedirs(directory) pixmap = QPixmap() if file is not None and pixmap.load(file): if pixmap.size().width() > self.max_size or pixmap.size().height( ) > self.max_size: pixmap = pixmap.scaled(self.max_size, self.max_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) buffer = QBuffer() pixmap.save(buffer, 'png') data = str(buffer.data()) with open(filename, 'wb') as f: f.write(data) icon = QIcon(pixmap) icon.filename = filename icon.content = data else: unlink(filename) icon = None self.iconmap[id] = icon return icon
def animate_slice(sliceviewer, name, start, end, filename, num_frames=10, font_size=24): """Generate an animated gif of a 2D slice moving through a third dimension. Args: sliceviewer (SliceViewer): A sliceviewer instance. name (str): The name of the third dimension to use. start (float): The starting value of the third dimension. end (float): The end value of the third dimension. filename (str): The file to save the gif to. Kwargs: num_frames (int): The number of frames the gif should contain. font_size: (int): The size of the caption. Example: ws = CreateMDWorkspace(3, Extents=[-10,10,-10,10,-10,10], Names=["X","Y","Z"], Units=["u","u","u"]) FakeMDEventData(ws, PeakParams=[10000,0,0,0,1]) sv = plotSlice(ws) #Resize and configure the slice viewer how you want the output to look sv.setNormalization(1) # We need to normalize by volume in this case, or the data won't show up #This will create a gif iterating from Z = -1 to Z = 1 animate_slice(sv, "Z", -1, 1, "output.gif") """ #Generate all the individual frames images = [] for slice_point in numpy.linspace(start, end, num_frames): sliceviewer.setSlicePoint(name, slice_point) sliceviewer.refreshRebin() qimg = sliceviewer.getImage().toImage() data = QByteArray() buf = QBuffer(data) qimg.save(buf, "PNG") image = Image(blob=str(data)) captionstrip_size = font_size + 10 #To add whitespace to the top, we add a vertical border, #then crop out the bottom border image.border(Color("#fff"), 0, captionstrip_size) image.crop(0, 0, image.width, image.height - captionstrip_size) #Write the caption into the whitespace draw = Drawing() draw.font_size = font_size draw.text(5, font_size, "%s = %g" % (name, slice_point)) draw(image) images.append(image) #Create a new image with the right dimensions animation = Image(width=images[0].width, height=images[0].height) #Copy in the frames from all the generated images for image in images: animation.sequence.append(image.sequence[0]) #Drop the initial blank frame del animation.sequence[0] #Write the animation to disk animation.save(filename=filename)
def newfunc(): ba = QByteArray(data) # keep reference to avoid GC f = QBuffer(ba) f.open(mode) try: func(f) finally: f.close()
def pasted(self, checked): clipboard = QApplication.clipboard() mime = clipboard.mimeData() if mime.hasImage(): pixmap = clipboard.pixmap() byteArray = QByteArray() buffer = QBuffer(byteArray) pixmap.save(buffer, "PNG") self.call("setClipboard", str(byteArray.toBase64(), sys.stdout.encoding))
def get_html_img(scene): """ Create HTML img element with base64-encoded image from the scene """ byte_array = QByteArray() filename = QBuffer(byte_array) filename.open(QIODevice.WriteOnly) PngFormat.write(filename, scene) img_encoded = byte_array.toBase64().data().decode("utf-8") return "<img src='data:image/png;base64,%s'/>" % img_encoded
def render_image(self): public_rect = self.live_text_rect() #global_rect = QtCore.QRect(self.mapToGlobal(public_rect.topLeft()), self.mapToGlobal(public_rect.bottomRight())) pixmap = QPixmap.grabWindow(self.win_id, public_rect.x() + 1, public_rect.y() + 1, 768, 576) buf = QBuffer() buf.open(QIODevice.WriteOnly) pixmap.save(buf, "JPG", 75) return buf.data()
def render_to_file(self, url, file_object): """Renders the image into a File resource. Returns the size of the data that has been written. """ format = self.format # this may not be constant due to processEvents() image = self.render(url) qBuffer = QBuffer() image.save(qBuffer, format, quality=self.quality) file_object.write(qBuffer.buffer().data()) return qBuffer.size()
def pixmap_to_imgformat(pixmap, format): import io from PyQt4.QtCore import QBuffer, QByteArray, QIODevice byte_array = QByteArray() buffer = QBuffer(byte_array) buffer.open(QIODevice.WriteOnly) pixmap.save(buffer, format) string_io = io.BytesIO(byte_array) string_io.seek(0) return string_io.read()
def getImage(self): """ Return the loaded image """ if self.isDefault: return None pix = self.orignalimage by = QByteArray() buf = QBuffer(by) buf.open(QIODevice.WriteOnly) pix.save(buf, "JPG") return by
def _getPng(self, width=None, height=None): image = QImage(self.web_page.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) self.web_page.mainFrame().render(painter) painter.end() if width: image = image.scaledToWidth(width, Qt.SmoothTransformation) if height: image = image.copy(0, 0, width, height) b = QBuffer() image.save(b, "png") return bytes(b.data())
def QIm2PIL(qimg): buff = QBuffer() buff.open(QIODevice.WriteOnly) qimg.save(buff, 'BMP') fp = StringIO() fp.write(buff.data()) buff.close() fp.seek(0) pilimg = Image.open(fp) if pilimg.mode == 'P': return pilimg.convert('L') return pilimg
def _qimage_to_pil(self, qimage): """ Convert QImage to PIL Image """ ba = QByteArray() bf = QBuffer(ba) bf.open(QIODevice.WriteOnly) qimage.save(bf, 'TIFF', quality=100) bf.close() buf = StringIO() buf.write(bf.data()) buf.seek(0) return PIL.Image.open(buf)
def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) sizes = None logger = self.oeb.logger if view_box is not None: try: box = [ float(x) for x in filter(None, re.split('[, ]', view_box)) ] sizes = [box[2] - box[0], box[3] - box[1]] except (TypeError, ValueError, IndexError): logger.warn( 'SVG image has invalid viewBox="%s", ignoring the viewBox' % view_box) else: for image in elem.xpath( 'descendant::*[local-name()="image" and ' '@height and contains(@height, "%")]'): logger.info( 'Found SVG image height in %, trying to convert...') try: h = float(image.get('height').replace('%', '')) / 100. image.set('height', str(h * sizes[1])) except: logger.exception( 'Failed to convert percentage height:', image.get('height')) data = QByteArray(xml2str(elem, with_tail=False)) svg = QSvgRenderer(data) size = svg.defaultSize() if size.width() == 100 and size.height() == 100 and sizes: size.setWidth(sizes[0]) size.setHeight(sizes[1]) if width or height: size.scale(width, height, Qt.KeepAspectRatio) logger.info('Rasterizing %r to %dx%d' % (elem, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, format) return str(array)
def grab_svg(scene): """ Return a SVG rendering of the scene contents. Parameters ---------- scene : :class:`CanvasScene` """ from PyQt4.QtSvg import QSvgGenerator svg_buffer = QBuffer() gen = QSvgGenerator() gen.setOutputDevice(svg_buffer) items_rect = scene.itemsBoundingRect().adjusted(-10, -10, 10, 10) if items_rect.isNull(): items_rect = QRectF(0, 0, 10, 10) width, height = items_rect.width(), items_rect.height() rect_ratio = float(width) / height # Keep a fixed aspect ratio. aspect_ratio = 1.618 if rect_ratio > aspect_ratio: height = int(height * rect_ratio / aspect_ratio) else: width = int(width * aspect_ratio / rect_ratio) target_rect = QRectF(0, 0, width, height) source_rect = QRectF(0, 0, width, height) source_rect.moveCenter(items_rect.center()) gen.setSize(target_rect.size().toSize()) gen.setViewBox(target_rect) painter = QPainter(gen) # Draw background. painter.setBrush(QBrush(Qt.white)) painter.drawRect(target_rect) # Render the scene scene.render(painter, target_rect, source_rect) painter.end() buffer_str = str(svg_buffer.buffer()) return unicode(buffer_str.decode("utf-8"))
def capture_image(session, selector=None, outformat="jpg"): """ capture page as image """ # do capture now cap = None if selector is not None: cap = session.capture(selector=selector) else: cap = session.capture() # create a buffered image buffer = QBuffer() buffer.open(QIODevice.ReadWrite) cap.save(buffer, 'JPG' if outformat.upper() in ('JPG', 'JPEG') else 'PNG') buffer.close() return buffer, 'image/' + 'jpeg' if outformat.upper() in ('JPG','JPEG') else 'png'
def __init__(self, parent=None): QWidget.__init__(self, parent) format = QAudioFormat() format.setChannels(1) format.setFrequency(22050) format.setSampleSize(16) format.setCodec("audio/pcm") format.setByteOrder(QAudioFormat.LittleEndian) format.setSampleType(QAudioFormat.SignedInt) self.output = QAudioOutput(format, self) self.frequency = 440 self.volume = 0 self.buffer = QBuffer() self.data = QByteArray() self.deviceLineEdit = QLineEdit() self.deviceLineEdit.setReadOnly(True) self.deviceLineEdit.setText( QAudioDeviceInfo.defaultOutputDevice().deviceName()) self.pitchSlider = QSlider(Qt.Horizontal) self.pitchSlider.setMaximum(100) self.volumeSlider = QSlider(Qt.Horizontal) self.volumeSlider.setMaximum(32767) self.volumeSlider.setPageStep(1024) self.playButton = QPushButton(self.tr("&Play")) self.pitchSlider.valueChanged.connect(self.changeFrequency) self.volumeSlider.valueChanged.connect(self.changeVolume) self.playButton.clicked.connect(self.play) formLayout = QFormLayout() formLayout.addRow(self.tr("Device:"), self.deviceLineEdit) formLayout.addRow(self.tr("P&itch:"), self.pitchSlider) formLayout.addRow(self.tr("&Volume:"), self.volumeSlider) buttonLayout = QVBoxLayout() buttonLayout.addWidget(self.playButton) buttonLayout.addStretch() horizontalLayout = QHBoxLayout(self) horizontalLayout.addLayout(formLayout) horizontalLayout.addLayout(buttonLayout)
def connect_json_put(self, data): """Send put request with json string. :param data: Json string data :type data: str """ if self.auth_token: # Add authentication token to request self.req.setRawHeader('Authorization', 'token %s' % self.auth_token) self.req.setRawHeader("Content-Type", "application/json") json_string = QByteArray(data) p_buffer = QBuffer(self.manager) p_buffer.setData(json_string) self.reply = self.manager.sendCustomRequest(self.req, 'PUT', p_buffer) self.connect_request()
def __init__(self, parent, request): QNetworkReply.__init__(self, parent) self.qbuffer = None self.connect(self, SIGNAL('abouteToClose()'), self.__close) self.byteArray = QByteArray() self.qbuffer = QBuffer(self.byteArray) self.node = vfs().getnode(str(request.url().path().toUtf8())) self.thumbnailer = Thumbnailer() self.connect(self.thumbnailer, SIGNAL("ThumbnailUpdate"), self.updateThumbnail) self.setRequest(request) self.setOperation(QNetworkAccessManager.GetOperation) mime = "image/jpg" self.setHeader(QNetworkRequest.ContentTypeHeader, QVariant(mime)) self.open() self.setUrl(request.url()) self.connect(parent, SIGNAL("ready"), self.ready) self.ready()
def rasterize_external(self, elem, style, item, svgitem): width = style['width'] height = style['height'] width = (width / 72) * self.profile.dpi height = (height / 72) * self.profile.dpi data = QByteArray(str(svgitem)) svg = QSvgRenderer(data) size = svg.defaultSize() size.scale(width, height, Qt.KeepAspectRatio) key = (svgitem.href, size.width(), size.height()) if key in self.images: href = self.images[key] else: logger = self.oeb.logger logger.info('Rasterizing %r to %dx%d' % (svgitem.href, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, 'PNG') data = str(array) manifest = self.oeb.manifest href = os.path.splitext(svgitem.href)[0] + '.png' id, href = manifest.generate(svgitem.id, href) manifest.add(id, href, PNG_MIME, data=data) self.images[key] = href elem.tag = XHTML('img') for attr in elem.attrib: if attr not in KEEP_ATTRS: del elem.attrib[attr] elem.attrib['src'] = item.relhref(href) if elem.text: elem.attrib['alt'] = elem.text elem.text = None for child in elem: elem.remove(child)
def png(self, width=None, height=None, b64=False): """ Return screenshot in PNG format """ self.logger.log("getting PNG", min_level=2) image = QImage(self.web_page.viewportSize(), QImage.Format_ARGB32) painter = QPainter(image) self.web_page.mainFrame().render(painter) painter.end() self.store_har_timing("_onScreenshotPrepared") if width: image = image.scaledToWidth(width, Qt.SmoothTransformation) if height: image = image.copy(0, 0, width, height) b = QBuffer() image.save(b, "png") result = bytes(b.data()) if b64: result = base64.b64encode(result) self.store_har_timing("_onPngRendered") return result
def __init__(self, parent, request): QNetworkReply.__init__(self, parent) self.__parent = parent self.qbuffer = None self.connect(self, SIGNAL('abouteToClose()'), self.__close) self.byteArray = QByteArray() self.qbuffer = QBuffer(self.byteArray) self.setRequest(request) self.setOperation(QNetworkAccessManager.GetOperation) self.setHeader( QNetworkRequest.ContentTypeHeader, QVariant( '"text/javascript" charset="utf-8" language="javascript"')) self.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QVariant(QNetworkRequest.AlwaysNetwork)) self.open() self.setUrl(request.url()) self.writeJS() QTimer.singleShot(0, self, SIGNAL("readyRead()")) QTimer.singleShot(0, self, SIGNAL("finished()"))
def prepare(self): """ """ Logger.instance().debug("preparing plugin") # convert qicon to base64 pixmapIcon = self.pluginIcon.pixmap(64, 64, mode=QIcon.Normal, state=QIcon.Off) byteArray = QByteArray() buffer = QBuffer(byteArray) buffer.open(QIODevice.WriteOnly) pixmapIcon.save(buffer, "png", quality=100) iconBase64 = byteArray.toBase64().data() Logger.instance().debug("icon converted to base64") self.sendMessage(cmd='configure', data=str(iconBase64, 'utf8'), more={"description": self.pluginDescription})
def do_GET(self): self.thread = thread = OSCThread() thread.daemon = True thread.start() actors = list() is_item1 = True is_item2 = True is_item3 = True def setPositions(): for ix, item in enumerate(actors): item.setPos(0, ix * 6) def scale_data(data, ix, max_items): scale = 254 / max_items * ix return [value / max_items + scale for value in data] try: self.path = re.sub('[^.a-zA-Z0-9]', "", str(self.path)) if self.path == "" or self.path == None or self.path[:1] == ".": return if self.path.endswith(".html"): f = open(curdir + sep + self.path) self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(f.read()) f.close() elif self.path.endswith(".mjpeg"): data_points = 1000 self.send_response(200) plot_data1 = data = deque([0] * data_points) plot_data2 = data = deque([0] * data_points) plot_data3 = data = deque([0] * data_points) plt = PlotWidget(title="<h1>EKG</h1>", name="Merle") plt.hide() plotItem1 = pg.PlotCurveItem(pen=pg.mkPen('r', width=2), name="bjoern") plotItem2 = pg.PlotCurveItem(pen=pg.mkPen('g', width=2), name="merle") plotItem3 = pg.PlotCurveItem(pen=pg.mkPen('b', width=2), name="uwe") print type(plotItem1) pen = pg.mkPen(254, 254, 254) plotItem1.setShadowPen(pen=pen, width=6, cosmetic=True) plotItem2.setShadowPen(pen=pen, width=6, cosmetic=True) plotItem3.setShadowPen(pen=pen, width=6, cosmetic=True) actors.append(plotItem1) actors.append(plotItem2) actors.append(plotItem3) plotItem1.setPos(0, 0 * 6) plotItem2.setPos(0, 1 * 6) plotItem3.setPos(0, 2 * 6) plt.addItem(plotItem1) plt.addItem(plotItem2) plt.addItem(plotItem3) plt.setLabel('left', "<h2>Amplitude</h2>") plt.setLabel('bottom', "<h2>Time</h2>") plt.showGrid(True, True) ba = plt.getAxis("bottom") bl = plt.getAxis("left") ba.setTicks([]) bl.setTicks([]) plt.setYRange(0, 254) self.wfile.write( "Content-Type: multipart/x-mixed-replace; boundary=--aaboundary" ) self.wfile.write("\r\n\r\n") plt.resize(1280, 720) while 1: while 1: try: osc_address, args = queue.get_nowait() except Queue.Empty: break value = args[0] if osc_address == "/bjoern/ekg": plot_data1.append(value) plot_data1.popleft() try: plotItem1.setData(y=np.array( scale_data(plot_data1, actors.index(plotItem1), len(actors))), clear=True) except ValueError: pass elif osc_address == "/merle/ekg": plot_data2.append(value) plot_data2.popleft() try: plotItem2.setData(y=np.array( scale_data(plot_data2, actors.index(plotItem2), len(actors))), clear=True) except ValueError: pass elif osc_address == "/uwe/ekg": plot_data3.append(value) plot_data3.popleft() try: plotItem3.setData(y=np.array( scale_data(plot_data3, actors.index(plotItem3), len(actors))), clear=True) except ValueError: pass elif osc_address == "/plot/uwe": if value == 1 and is_item3 == False: print "uwe on" plt.addItem(plotItem3) is_item3 = True actors.append(plotItem3) setPositions() elif value == 0 and is_item3 == True: print "uwe off" plt.removeItem(plotItem3) is_item3 = False actors.remove(plotItem3) setPositions() elif osc_address == "/plot/merle": if value == 1 and is_item2 == False: print "merle on" plt.addItem(plotItem2) is_item2 = True actors.append(plotItem2) setPositions() elif value == 0 and is_item2 == True: print "merle off" plt.removeItem(plotItem2) is_item2 = False actors.remove(plotItem2) setPositions() elif osc_address == "/plot/bjoern": if value == 1 and is_item1 == False: print "bjoern on" plt.addItem(plotItem1) is_item1 = True actors.append(plotItem1) setPositions() elif value == 0 and is_item1 == True: print "bjoern off" plt.removeItem(plotItem1) is_item1 = False actors.remove(plotItem1) setPositions() exporter = pg.exporters.ImageExporter.ImageExporter( plt.plotItem) img = exporter.export("tmpfile", True) buffer = QBuffer() buffer.open(QIODevice.WriteOnly) img.save(buffer, "JPG", 100) JpegData = buffer.data() del buffer self.wfile.write( "--aaboundary\r\nContent-Type: image/jpeg\r\nContent-length: %d\r\n\r\n%s\r\n\r\n\r\n" % (len(JpegData), JpegData)) elif self.path.endswith(".jpeg"): f = open(curdir + sep + self.path) self.send_response(200) self.send_header('Content-type', 'image/jpeg') self.end_headers() self.wfile.write(f.read()) f.close() return except (KeyboardInterrupt, SystemError): thread.running = False thread.join() except IOError: self.send_error(404, 'File Not Found: %s' % self.path)
def base64image(image): ba = QByteArray() buffer = QBuffer(ba) buffer.open(QIODevice.WriteOnly) image.save(buffer, "PNG") return "data:image/png;base64," + ba.toBase64().data()