⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qpnghandler.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    QMap<QString, QString>::ConstIterator it = text.constBegin();    int i = 0;    while (it != text.constEnd()) {        QString t = it.value();        if (t.length() < 40)            text_ptr[i].compression = PNG_TEXT_COMPRESSION_NONE;        else            text_ptr[i].compression = PNG_TEXT_COMPRESSION_zTXt;        text_ptr[i].key = qstrdup(it.key().left(79).toLatin1().constData());#ifndef PNG_iTXt_SUPPORTED        QByteArray value = it.value().toLatin1();        text_ptr[i].text = qstrdup(value.constData());        text_ptr[i].text_length = value.size();#else        QByteArray value = it.value().toUtf8();        text_ptr[i].text = qstrdup(value.constData());        text_ptr[i].text_length = 0;        text_ptr[i].itxt_length = value.size();        text_ptr[i].lang = "UTF-8";        text_ptr[i].lang_key = qstrdup(it.key().toUtf8().constData());#endif        ++i;        ++it;    }    png_set_text(png_ptr, info_ptr, text_ptr, i);    for (i = 0; i < text.size(); ++i) {        delete [] text_ptr[i].key;        delete [] text_ptr[i].text;#ifdef PNG_iTXt_SUPPORTED        delete [] text_ptr[i].lang_key;#endif    }    delete [] text_ptr;}#endifbool QPNGImageWriter::writeImage(const QImage& image, int off_x, int off_y){    return writeImage(image, -1, QString(), off_x, off_y);}bool QPNGImageWriter::writeImage(const QImage& image_in, int quality_in, const QString &description,                                 int off_x_in, int off_y_in){#ifdef QT_NO_IMAGE_TEXT    Q_UNUSED(description);#endif    QImage image = image_in;    if(image.format() == QImage::Format_ARGB32_Premultiplied)        image = image.convertToFormat(QImage::Format_ARGB32);    else if (image.format() == QImage::Format_RGB16)        image = image.convertToFormat(QImage::Format_RGB32);    QPoint offset = image.offset();    int off_x = off_x_in + offset.x();    int off_y = off_y_in + offset.y();    png_structp png_ptr;    png_infop info_ptr;    png_bytep* row_pointers;    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0);    if (!png_ptr) {        return false;    }    png_set_error_fn(png_ptr, 0, 0, qt_png_warning);    info_ptr = png_create_info_struct(png_ptr);    if (!info_ptr) {        png_destroy_write_struct(&png_ptr, 0);        return false;    }    if (setjmp(png_jmpbuf(png_ptr))) {        png_destroy_write_struct(&png_ptr, &info_ptr);        return false;    }    int quality = quality_in;    if (quality >= 0) {        if (quality > 9) {            qWarning("PNG: Quality %d out of range", quality);            quality = 9;        }        png_set_compression_level(png_ptr, quality);    }    if (gamma != 0.0) {        png_set_gAMA(png_ptr, info_ptr, 1.0/gamma);    }    png_set_write_fn(png_ptr, (void*)this, qpiw_write_fn, qpiw_flush_fn);    info_ptr->channels =        (image.depth() == 32)        ? (image.format() == QImage::Format_RGB32 ? 3 : 4)        : 1;    png_set_IHDR(png_ptr, info_ptr, image.width(), image.height(),        image.depth() == 1 ? 1 : 8 /* per channel */,        image.depth() == 32            ? image.format() == QImage::Format_RGB32                ? PNG_COLOR_TYPE_RGB                : PNG_COLOR_TYPE_RGB_ALPHA            : PNG_COLOR_TYPE_PALETTE, 0, 0, 0);    //png_set_sBIT(png_ptr, info_ptr, 8);    info_ptr->sig_bit.red = 8;    info_ptr->sig_bit.green = 8;    info_ptr->sig_bit.blue = 8;    if (image.format() == QImage::Format_MonoLSB)       png_set_packswap(png_ptr);    png_colorp palette = 0;    png_bytep copy_trans = 0;    if (image.numColors()) {        // Paletted        int num_palette = image.numColors();        palette = new png_color[num_palette];        png_set_PLTE(png_ptr, info_ptr, palette, num_palette);        int* trans = new int[num_palette];        int num_trans = 0;        for (int i=0; i<num_palette; i++) {            QRgb rgb=image.color(i);            info_ptr->palette[i].red = qRed(rgb);            info_ptr->palette[i].green = qGreen(rgb);            info_ptr->palette[i].blue = qBlue(rgb);            trans[i] = rgb >> 24;            if (trans[i] < 255) {                num_trans = i+1;            }        }        if (num_trans) {            copy_trans = new png_byte[num_trans];            for (int i=0; i<num_trans; i++)                copy_trans[i] = trans[i];            png_set_tRNS(png_ptr, info_ptr, copy_trans, num_trans, 0);        }        delete [] trans;    }    if (image.format() != QImage::Format_RGB32) {        info_ptr->sig_bit.alpha = 8;    }    // Swap ARGB to RGBA (normal PNG format) before saving on    // BigEndian machines    if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {        png_set_swap_alpha(png_ptr);    }    // Qt==ARGB==Big(ARGB)==Little(BGRA)    if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) {        png_set_bgr(png_ptr);    }    if (off_x || off_y) {        png_set_oFFs(png_ptr, info_ptr, off_x, off_y, PNG_OFFSET_PIXEL);    }    if (frames_written > 0)        png_set_sig_bytes(png_ptr, 8);    if (image.dotsPerMeterX() > 0 || image.dotsPerMeterY() > 0) {        png_set_pHYs(png_ptr, info_ptr,                image.dotsPerMeterX(), image.dotsPerMeterY(),                PNG_RESOLUTION_METER);    }#ifndef QT_NO_IMAGE_TEXT    set_text(image, png_ptr, info_ptr, description);#endif    png_write_info(png_ptr, info_ptr);    if (image.depth() != 1)        png_set_packing(png_ptr);    if (image.format() == QImage::Format_RGB32)        png_set_filler(png_ptr, 0,            QSysInfo::ByteOrder == QSysInfo::BigEndian ?                PNG_FILLER_BEFORE : PNG_FILLER_AFTER);    if (looping >= 0 && frames_written == 0) {        uchar data[13] = "NETSCAPE2.0";        //                0123456789aBC        data[0xB] = looping%0x100;        data[0xC] = looping/0x100;        png_write_chunk(png_ptr, (png_byte*)"gIFx", data, 13);    }    if (ms_delay >= 0 || disposal!=Unspecified) {        uchar data[4];        data[0] = disposal;        data[1] = 0;        data[2] = (ms_delay/10)/0x100; // hundredths        data[3] = (ms_delay/10)%0x100;        png_write_chunk(png_ptr, (png_byte*)"gIFg", data, 4);    }    png_uint_32 width;    png_uint_32 height;    int bit_depth;    int color_type;    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,        0, 0, 0);    const uchar *data = image.bits();    int bpl = image.bytesPerLine();    row_pointers = new png_bytep[height];    uint y;    for (y=0; y<height; y++) {        row_pointers[y] = (png_bytep)(data + y * bpl);    }    png_write_image(png_ptr, row_pointers);    delete [] row_pointers;    png_write_end(png_ptr, info_ptr);    frames_written++;    if (palette)        delete [] palette;    if (copy_trans)        delete [] copy_trans;    png_destroy_write_struct(&png_ptr, &info_ptr);    return true;}static bool write_png_image(const QImage &image, QIODevice *device,                            int quality, float gamma, const QString &description){    QPNGImageWriter writer(device);    if (quality >= 0) {        quality = qMin(quality, 100);        quality = (100-quality) * 9 / 91; // map [0,100] -> [9,0]    }    writer.setGamma(gamma);    return writer.writeImage(image, quality, description);}QPngHandler::QPngHandler()    : d(new QPngHandlerPrivate(this)){}QPngHandler::~QPngHandler(){    if (d->png_ptr)        png_destroy_read_struct(&d->png_ptr, &d->info_ptr, &d->end_info);    delete d;}bool QPngHandler::canRead() const{    if (d->state == QPngHandlerPrivate::Ready) {        if (!canRead(device()))            return false;        setFormat("png");        return true;    }    return d->state != QPngHandlerPrivate::Error;}bool QPngHandler::canRead(QIODevice *device){    if (!device) {        qWarning("QPngHandler::canRead() called with no device");        return false;    }    return device->peek(8) == "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A";}bool QPngHandler::read(QImage *image){    if (!canRead())        return false;    return d->readPngImage(image);}bool QPngHandler::write(const QImage &image){    return write_png_image(image, device(), d->quality, d->gamma, d->description);}bool QPngHandler::supportsOption(ImageOption option) const{    return option == Gamma        || option == Description        || option == Quality        || option == Size;}QVariant QPngHandler::option(ImageOption option) const{    if (d->state == QPngHandlerPrivate::Error)        return QVariant();    if (d->state == QPngHandlerPrivate::Ready && !d->readPngHeader())        return QVariant();    if (option == Gamma)        return d->gamma;    else if (option == Quality)        return d->quality;    else if (option == Description)        return d->description;    else if (option == Size)        return QSize(d->info_ptr->width, d->info_ptr->height);    return 0;}void QPngHandler::setOption(ImageOption option, const QVariant &value){    if (option == Gamma)        d->gamma = value.toDouble();    else if (option == Quality)        d->quality = value.toInt();    else if (option == Description)        d->description = value.toString();}QByteArray QPngHandler::name() const{    return "png";}#endif // QT_NO_IMAGEFORMAT_PNG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -