📄 qpixmap_raster.cpp
字号:
#ifndef QT_NO_IMAGE_HEURISTIC_MASKQBitmap QPixmap::createHeuristicMask(bool clipTight ) const{ QBitmap m = fromImage(toImage().createHeuristicMask(clipTight)); return m;}#endifQBitmap QPixmap::createMaskFromColor(const QColor &maskColor) const{ QImage maskImage(size(), QImage::Format_MonoLSB); QImage image = toImage(); QRgb mColor = maskColor.rgba(); for (int w = 0; w < width(); w++) { for (int h = 0; h < height(); h++) { if (image.pixel(w, h) == mColor) maskImage.setPixel(w, h, Qt::color1); else maskImage.setPixel(w, h, Qt::color0); } } QBitmap m = fromImage(maskImage); return m;}QPixmap QPixmap::grabWidget(QWidget *widget, const QRect &rect){ if (!widget) return QPixmap(); QRect r(rect); if (r.width() < 0) r.setWidth(widget->width() - rect.x()); if (r.height() < 0) r.setHeight(widget->height() - rect.y()); if (!r.intersects(widget->rect())) return QPixmap(); QPixmap res(r.size()); widget->d_func()->drawWidget(&res, r, -r.topLeft(), QWidgetPrivate::DrawRecursive | QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen | QWidgetPrivate::DrawInvisible); return res;}QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectMode, Qt::TransformationMode mode ) const{ return QPixmap::fromImage(data->image.scaled(size, aspectMode, mode));}QPixmap QPixmap::scaledToWidth(int w, Qt::TransformationMode mode) const{ return QPixmap::fromImage(data->image.scaledToWidth(w, mode));}QPixmap QPixmap::scaledToHeight(int h, Qt::TransformationMode mode) const{ return QPixmap::fromImage(data->image.scaledToHeight(h, mode));}QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode ) const{ return QPixmap::fromImage(data->image.transformed(matrix, mode));}QMatrix QPixmap::trueMatrix(const QMatrix &m, int w, int h){ return QImage::trueMatrix(m, w, h);}QImage QPixmap::toImage() const{ return data->image;}QPixmap QPixmap::fromImage(const QImage &image, Qt::ImageConversionFlags flags ){ Q_UNUSED(flags); // ### This will create a temporary image. QPixmap pixmap(image.width(), image.height()); switch (image.format()) { case QImage::Format_Mono: case QImage::Format_MonoLSB: pixmap.data->image = image.convertToFormat(QImage::Format_RGB32); break; case QImage::Format_RGB32: case QImage::Format_ARGB32_Premultiplied:#ifdef Q_WS_QWS case QImage::Format_RGB16:#endif pixmap.data->image = image; break; default: pixmap.data->image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); break; } return pixmap;}bool QPixmap::load(const QString& fileName, const char *format, Qt::ImageConversionFlags flags ){ if (fileName.isEmpty()) return false; QFileInfo info(fileName); QString key; key.append(QLatin1String("qt_pixmap_")).append(info.absoluteFilePath()).append( QLatin1Char('_')).append(QString::number(info.lastModified().toTime_t())).append( QLatin1Char('_')).append(QString::number(data->type)); detach(); if (QPixmapCache::find(key, *this)) return true; QImage image = QImageReader(fileName, format).read(); if (!image.isNull()) { if (data->type == BitmapType) *this = QBitmap::fromImage(image, flags); else *this = fromImage(image, flags); if (!isNull()) { QPixmapCache::insert(key, *this); return true; } } return false;}bool QPixmap::loadFromData(const uchar *buf, uint len, const char* format, Qt::ImageConversionFlags flags ){ QByteArray a = QByteArray::fromRawData(reinterpret_cast<const char *>(buf), len); QBuffer b(&a); b.open(QIODevice::ReadOnly); detach(); QImage image = QImageReader(&b, format).read(); if (!image.isNull()) { if (data->type == BitmapType) *this = QBitmap::fromImage(image, flags); else *this = fromImage(image, flags); } return !isNull();}bool QPixmap::save(const QString& fileName, const char* format, int quality ) const{ if (isNull()) return false; // nothing to save QImageWriter writer(fileName, format); return doImageIO(&writer, quality);}bool QPixmap::save(QIODevice* device, const char* format, int quality ) const{ if (isNull()) return false; // nothing to save QImageWriter writer(device, format); return doImageIO(&writer, quality);}int QPixmap::serialNumber() const{ return data->image.serialNumber();}bool QPixmap::isDetached() const{ return data->count == 1;}void QPixmap::detach(){ ++data->detach_no; if (data->count != 1) *this = copy();}#ifdef QT3_SUPPORTstatic Qt::ImageConversionFlags colorModeToFlags(QPixmap::ColorMode mode){ Qt::ImageConversionFlags flags = Qt::AutoColor; switch (mode) { case QPixmap::Color: flags |= Qt::ColorOnly; break; case QPixmap::Mono: flags |= Qt::MonoOnly; break; default: break;// Nothing. } return flags;}bool QPixmap::load(const QString& fileName, const char *format, ColorMode mode){ return load(fileName, format, colorModeToFlags(mode));}bool QPixmap::loadFromData(const uchar *buf, uint len, const char* format, ColorMode mode){ return loadFromData(buf, len, format, colorModeToFlags(mode));}bool QPixmap::convertFromImage(const QImage &image, ColorMode mode){ *this = fromImage(image, colorModeToFlags(mode)); return !isNull();}#endif // QT3_SUPPORTint QPixmap::metric(PaintDeviceMetric metric) const{ return data->image.metric(metric);}bool QPixmap::doImageIO(QImageWriter *writer, int quality) const{ if (quality > 100 || quality < -1) qWarning("QPixmap::save: quality out of range [-1,100]"); if (quality >= 0) writer->setQuality(qMin(quality,100)); return writer->write(toImage());}void QPixmap::init(int w, int h, Type type){ if (!qApp) { qFatal("QPixmap: Must construct a QApplication before a QPaintDevice"); return; } data = new QPixmapData; data->type = type; data->detach_no = 0; if (type == PixmapType) { data->image = QImage(w, h, QImage::Format_RGB32); } else { data->image = data->createBitmapImage(w, h); }}void QPixmap::deref(){ if(data && data->deref()) { // Destroy image if last ref delete data; data = 0; }}QPixmap QPixmap::copy(const QRect &rect) const{ if (data->type == BitmapType) return QBitmap::fromImage(toImage().copy(rect)); else return QPixmap::fromImage(toImage().copy(rect));}#ifndef QT_NO_DATASTREAMQDataStream &operator<<(QDataStream &s, const QPixmap &pixmap){ s << pixmap.toImage(); return s;}QDataStream &operator>>(QDataStream &s, QPixmap &pixmap){ QImage img; s >> img; if (pixmap.data->type == QPixmap::BitmapType) pixmap = QBitmap::fromImage(img); else pixmap = QPixmap::fromImage(img); return s;}#endif // QT_NO_DATASTREAMQPaintEngine *QPixmap::paintEngine() const{ return data->image.paintEngine();}void QPixmap::setAlphaChannel(const QPixmap &alphaChannel){ detach(); data->image.setAlphaChannel(alphaChannel.toImage());}QPixmap QPixmap::alphaChannel() const{ return QPixmap::fromImage(data->image.alphaChannel());}QImage QPixmapData::createBitmapImage(int w, int h){ QImage bitmap(w, h, QImage::Format_MonoLSB); if (bitmap.isNull()) return bitmap; bitmap.setNumColors(2); bitmap.setColor(0, QColor(Qt::color0).rgba()); bitmap.setColor(1, QColor(Qt::color1).rgba()); return bitmap;}#ifdef QT3_SUPPORTQ_GUI_EXPORT void copyBlt(QPixmap *dst, int dx, int dy, const QPixmap *src, int sx, int sy, int sw, int sh){ Q_ASSERT_X(dst, "::copyBlt", "Destination pixmap must be non null"); Q_ASSERT_X(src, "::copyBlt", "Source pixmap must be non null"); QImage image = dst->toImage(); QPainter p(&image); p.setCompositionMode(QPainter::CompositionMode_Source); p.drawImage(dx, dy, src->toImage(), sx, sy, sw, sh); *dst = QPixmap::fromImage(image);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -