Qt实战之实现图片浏览器

目录
  • 图片浏览器逻辑
  • 效果图
  • 具体实现
    • utils.h
    • image.h
    • image_group.h
    • image_group.cpp
    • qimgviewwidget.h
    • qimgviewwidget.cpp
    • main.cpp

图片浏览器逻辑

实现图片浏览器用到了前面几乎所有的知识,包括窗口部件、布局、事件、对象模型与容器类、图形视图、模型/视图编程以及多线程等。大致流程为:首先定义一个图片类,该类包含图片的路径、文件名、文件id以及获取这些变量的函数。然后定义了一个图片数组类,主要包含添加图像以及获取所有图像以及新加入图像的函数。最后通过将图片名字加入到界面左侧QDockWidget部件中的QTreeView中,通过线程将图片的预览加入界面下侧的窗口部件中。最后通过双击可查看完整图片,以及通过滚轮和鼠标等事件来对图片进行一些操作。

效果图

具体实现

utils.h

#ifndef UTILS_H
#define UTILS_H

#include<QString>
#include<string>

//string to QString
inline QString str2qstr(const std::string& str)
{
    return QString::fromLocal8Bit(str.data());
}

//QString to string
inline std::string qstr2str(const QString& qstr)
{
    QByteArray cdata = qstr.toLocal8Bit();
    return std::string(cdata);
}

#endif // UTILS_H

image.h

#ifndef IMAGE_H
#define IMAGE_H
#include<string>
#include<vector>

using std::vector;
using std::string;

class Image
{
public:
    Image() = default;
    ~Image() = default;

    Image(const string& _path,const unsigned& _id):path_(_path),id_(_id){
        //从路径中获取图像名称
        auto pos = path_.find_last_of('\\') +1;
        if(pos == 0)
        {
            pos = path_.find_last_of('/')+1;
        }
        name_ = path_.substr(pos,path_.length() - pos);
        pos = name_.find_last_of('.');
        name_ = name_.substr(0,pos);
    }

    //设置相机所属的id
    void set_cam_id(const unsigned& _id){
        cam_id_ = _id;
    }

    //获取路径
    const string& get_path(){
        return path_;
    }

    //获取文件名
    const string& get_name(){
        return name_;
    }
    const unsigned &get_id(){
        return id_;
    }

    //获取相机id
    const unsigned& get_cam_id(){
        return cam_id_;
    }

private:
    string path_;
    string name_;
    unsigned id_;
    unsigned cam_id_;
};

#endif // IMAGE_H

image_group.h

#ifndef IMAGE_GROUP_H
#define IMAGE_GROUP_H
#include"image.h"

class image_group
{
public:
    image_group();
    ~image_group();

public:
    bool addImages(const vector<string>& img_paths);

    const vector<Image>& GetAllImages();

    const vector<Image>& GetNewAddingImages();

private:
    //所有图片数组
    vector<Image> all_images_;

    //新加入的图片数组
    vector<Image> new_images_;
};

#endif // IMAGE_GROUP_H

image_group.cpp

#include "image_group.h"

image_group::image_group()
{

}

image_group::~image_group()
{

}

bool image_group::addImages(const vector<std::string> &img_paths)
{
    new_images_.clear();
    for(auto& path: img_paths)
    {
        all_images_.emplace_back(path,all_images_.size());
        new_images_.emplace_back(path,all_images_.size());
    }
    return true;
}

const vector<Image> &image_group::GetAllImages()
{
    return all_images_;
}

const vector<Image> &image_group::GetNewAddingImages()
{
    return new_images_;
}

qimgviewwidget.h

#ifndef QIMGVIEWWIDGET_H
#define QIMGVIEWWIDGET_H

#include <QWidget>
#include<QImage>

//用于显示2D图像的窗口部件
class QImgViewWidget : public QWidget
{
    Q_OBJECT
public:
    explicit QImgViewWidget(QWidget *parent = nullptr);
    ~QImgViewWidget() = default;

    //从文件路径加载图片
    void SetImage(const QString& img_path);

    void ResetTransform();

private:
    //用来展示的image信息
    QImage img_display_;
    //原始pixmap信息
    QPixmap pix_ori_;
    //用来展示的pixmap信息
    QPixmap pix_display_;
    //图片路径
    QString img_path_;
    //鼠标滚轮控制的缩放比例
    float zoom_scale_;
    //由鼠标移动控制的移动
    QPoint move_step_;
    bool move_start_;
    bool is_moving_;
    QPoint mouse_point_;

protected:
    void paintEvent(QPaintEvent* event)override;
    void wheelEvent(QWheelEvent* event)override;
    void mousePressEvent(QMouseEvent* event)override;
    void mouseReleaseEvent(QMouseEvent* event)override;
    void mouseMoveEvent(QMouseEvent* event)override;
    void resizeEvent(QResizeEvent* event)override;

};

#endif // QIMGVIEWWIDGET_H

qimgviewwidget.cpp

#include "qimgviewwidget.h"
#include <QPainter>
#include <QWheelEvent>

QImgViewWidget::QImgViewWidget(QWidget *parent) : QWidget(parent)
{
    zoom_scale_ = 1.0f;
    move_start_ = false;
    is_moving_ = false;
}

void QImgViewWidget::SetImage(const QString &img_path)
{
    ResetTransform();
    QSize view_size = size();
    //通过QImage加载图像
    img_path_ = img_path;
    img_display_.load(img_path_);
    pix_ori_ = QPixmap::fromImage(img_display_);
    pix_display_ = pix_ori_.scaled(zoom_scale_ *size(),Qt::KeepAspectRatio);

}

void QImgViewWidget::ResetTransform()
{
    //重新设置缩放比例和移动位置
    zoom_scale_ = 1.0f;
    move_step_ = QPoint(0,0);
}

void QImgViewWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(move_step_.x()+(width()-pix_display_.width())/2,move_step_.y()+(height()- pix_display_.height()) / 2,pix_display_);
}

void QImgViewWidget::wheelEvent(QWheelEvent *event)
{
    //随滚轮缩放
    if(event->delta()>0)
    {
        zoom_scale_ *= 1.1;
    }
    else {
        zoom_scale_ *=0.9;
    }
    pix_display_ = pix_ori_.scaled(zoom_scale_ * size(),Qt::KeepAspectRatio);
    update();
}

void QImgViewWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        if(!move_start_)
        {
            move_start_ = true;
            is_moving_ = false;
            mouse_point_ = event->globalPos();
        }
    }
}

void QImgViewWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() ==Qt::LeftButton)
    {
        if(move_start_)
        {
            move_start_ = false;
            is_moving_ = false;
        }
    }
}

void QImgViewWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(move_start_)
    {
        const QPoint mos_pt = event->globalPos();
        move_step_ +=mos_pt - mouse_point_;
        is_moving_ = true;
        mouse_point_ = mos_pt;
        repaint();
    }
}

void QImgViewWidget::resizeEvent(QResizeEvent *event)
{
    pix_display_ = pix_ori_.scaled(zoom_scale_ *size(),Qt::KeepAspectRatio);
    update();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"image_group.h"
#include<QThread>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = Q_NULLPTR);
//    ~MainWindow();
    image_group* get_image_group(){
        return &image_group_;
    }
    Ui::MainWindow* get_ui(){
        return ui;
    }

    void InitTreeView();
    void InitPrewView();
    void InitDockView();
    void InitTabView();
    void InitLayout();
    void updateTreeView();
    void updatePreView();

private slots:
    void OnActionAddImages();
    void OnActiondoubleClickedTreeImage(const QModelIndex& index);

protected:
    void paintEvent(QPaintEvent* event)override;
    void resizeEvent(QResizeEvent* event)override;

private:
    Ui::MainWindow *ui;
    image_group image_group_;

};

class QUpdatePreviewThread :public QThread
{
    Q_OBJECT

public:
    QUpdatePreviewThread(MainWindow* mainwindow);
signals:
    void SingalAddPreview(const QPixmap& pixmap,const int& img_id);

private slots:
    void SlotAddPreview(const QPixmap& pixmap,const int& img_id);

protected:
    void run() override;
private:
    MainWindow* mainwindow_;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include"utils.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QStandardItemModel>
#include<QFileDialog>
#include<QMessageBox>
#include<QResizeEvent>
#include<QListWidgetItem>
#include<QImageReader>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowState(Qt::WindowMaximized);

    //初始化Ui
    InitDockView();
    InitTreeView();
    InitTabView();
    InitPrewView();

    InitLayout();

    connect(ui->action_addimages,&QAction::triggered,this,&MainWindow::OnActionAddImages);
    connect(ui->tree_images,&QTreeView::doubleClicked,this,&MainWindow::OnActiondoubleClickedTreeImage);
    connect(ui->list_previews,&QTreeView::doubleClicked,this,&MainWindow::OnActiondoubleClickedTreeImage);
}

void MainWindow::InitTreeView()
{
    //初始化tree view
    auto tree_imgs = ui->tree_images;
    auto* model = new QStandardItemModel(tree_imgs);
    tree_imgs->setModel(model);
    model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("images"));
    tree_imgs->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

void MainWindow::InitPrewView()
{
    //初始化preview view
    auto list_preview = ui->list_previews;
    list_preview->setIconSize(QSize(100,100));
    list_preview->setResizeMode(QListView::Adjust);
    list_preview->setViewMode(QListView::IconMode);
    list_preview->setMovement(QListView::Static);
    list_preview->setSpacing(10);

}

void MainWindow::InitDockView()
{
    //初始化dockView
    auto dp_workspace = (QDockWidget*)ui->dock_workspace;
    dp_workspace->setWindowTitle("Wokspace");
    addDockWidget(Qt::LeftDockWidgetArea,dp_workspace);
}

void MainWindow::InitTabView()
{
    //2d/3d部件的样式表
//    auto tab_view = ui->tab_mainview;
//    tab_view->setStyleSheet("QTabWidget:pane{ border: 1px ;}\
//                                QTabBar::tab{width:50px;height:28px; background-color:rgb(36,36,36); color:rgb(200,200,200); margin-right: 2px; margin-bottom:-2px;}\
//                                QTabBar::tab:selected{border:1px;border-bottom-color: none; background-color:rgb(50,50,50)}\
//                                QTabBar::tab:!selected{border-bottom: 3px;}\
//                            ");
//    tab_view->setCurrentIndex(0);

//    auto wid_model = ui->widget_model;
//    wid_model->setStyleSheet("background-color:rgb(80,80,80);");

//    auto wid_image = ui->widght_imgview;
//    wid_image->setStyleSheet(" background-color:rgb(80,80,80);");

//    //照片/控制台部件样式表
//    auto tab_info = ui->tab_info;
//    tab_info->setStyleSheet("QTabWidget:pane{ border: 1px ;}\
//                                QTabBar::tab{width:60px;height:28px; background-color:rgb(36,36,36); color:rgb(200,200,200); margin-right: 2px; margin-bottom:-2px;}\
//                                QTabBar::tab:selected{border:1px;border-bottom-color: none; background-color:rgb(50,50,50)}\
//                                QTabBar::tab:!selected{border-bottom: 3px;}\
//                            ");
//    auto wid_priviews = ui->widget_previews;
//    wid_priviews->setStyleSheet(" background-color:rgb(80,80,80);");

//    auto wid_console = ui->widget_console;
//    wid_console->setStyleSheet(" background-color:rgb(80,80,80);");
}

void MainWindow::InitLayout()
{

}

void MainWindow::updateTreeView()
{
    //相关操作后更新tree view。例如,加载图像
    const auto all_images = image_group_.GetAllImages();
    const auto new_images = image_group_.GetNewAddingImages();

    if(new_images.empty())
        return;
    const auto num_allimages = all_images.size();
    const auto num_images = new_images.size();

    auto* tree = ui->tree_images;
    auto* model = static_cast<QStandardItemModel*>(tree->model());
    QString str_title = QString("All Images (%1 Images)").arg(num_allimages);

    if(model->item(0,0) ==nullptr)
    {
        model->setItem(0,0,new QStandardItem(str_title));
    }
    else {
        auto item = model->item(0,0);
        item->setText(str_title);
    }

    //为tree添加图片的名字
    for(auto image:new_images)
    {
        model->item(0,0)->setChild(image.get_id(),0,new QStandardItem(str2qstr(image.get_name())));
    }

    tree->setExpanded(model->index(0,0),true);

    auto workspace = static_cast<QDockWidget*>(ui->dock_workspace);
    auto ws_size = workspace->frameSize();
    tree->setFixedWidth(ws_size.width());

}

void MainWindow::updatePreView()
{
    auto tab_info = ui->tab_info;
    tab_info->setCurrentIndex(0);

    //通过线程来创建previews
    QUpdatePreviewThread* thread = new QUpdatePreviewThread(this);
    thread->start();

}

void MainWindow::OnActionAddImages()
{
    QStringList file_paths = QFileDialog::getOpenFileNames(this,tr("Image Path"),"Data\\", tr("Image Files(*png *jpg *tif);"));

    //添加图片
    vector<string> str_paths;
    for(auto path:file_paths)
    {
        str_paths.push_back(qstr2str(path));
    }
    image_group_.addImages(str_paths);

    //更新tree view
    updateTreeView();
    //更新preview view
    updatePreView();

}

void MainWindow::OnActiondoubleClickedTreeImage(const QModelIndex &index)
{
    QMessageBox msg_box;

    auto* tree = ui->tree_images;
    auto* model = static_cast<QStandardItemModel*>(tree->model());
    unsigned img_id = index.row();

    const auto all_images = image_group_.GetAllImages();
    if(img_id>=all_images.size())
    {
        msg_box.setText("data error");
        msg_box.exec();
        return;
    }

    //获得双击的图片路径
    auto image = all_images[img_id];
    auto imgpath = str2qstr(image.get_path());

    //repaint
    auto img_view = ui->widght_imgview;
    img_view->SetImage(imgpath);
    img_view->repaint();

}

void MainWindow::paintEvent(QPaintEvent* event)
{
}

void MainWindow::resizeEvent(QResizeEvent* event)
{
    //自动调整所有小部件的大小
    const QSize size = event->size();
    const QRect frame_geometry = ui->central_widget->geometry();
    const QSize frame_size = ui->central_widget->size();
    const QSize menu_size = ui->menuBar->size();
    QSize layout_h1(menu_size.width() * 0.12, frame_size.height()),
                    layout_h2(menu_size.width() * 0.76, frame_size.height()),
                    layout_h3(menu_size.width() * 0.12, frame_size.height());
    QSize layout_v1(menu_size.width(), frame_size.height()*0.8),
                    layout_v2(menu_size.width(), frame_size.height()*0.2);

    // workspace
    ui->dock_workspace->setMinimumWidth(layout_h1.width());
    ui->dock_workspace->setMaximumHeight(frame_size.height());

    // main view(model and image)
    ui->tab_mainview->setFixedSize(layout_h2.width() - 10, layout_v1.height());
    QSize tab_bar_sz = ui->tab_mainview->tabBar()->size();
    ui->widget_model->setFixedSize(layout_h2.width() - 10, layout_v1.height() - tab_bar_sz.height());
    ui->widght_imgview->setFixedSize(layout_h2.width() - 10, layout_v1.height() - tab_bar_sz.height());
    ui->widget_gl_model->setFixedSize(layout_h2.width() - 10, layout_v1.height() - tab_bar_sz.height());

    // info view(photos and console)
    QRect view_rt = ui->tab_mainview->frameGeometry();
    ui->tab_info->setGeometry(view_rt.x(), view_rt.y() + view_rt.height()+5, layout_h2.width() - 10, layout_v2.height());
    auto tab_sz = ui->tab_info->size();
    tab_bar_sz = ui->tab_info->tabBar()->size();
    ui->list_previews->setGeometry(0, 0, tab_sz.width(), tab_sz.height()- tab_bar_sz.height());

    setMinimumSize(500, 500);

}

QUpdatePreviewThread::QUpdatePreviewThread(MainWindow *mainwindow)
{
    mainwindow_ = mainwindow;
    connect(this, SIGNAL(SingalAddPreview(const QPixmap&, const int&)), this, SLOT(SlotAddPreview(const QPixmap&, const int&)));
}

void QUpdatePreviewThread::SlotAddPreview(const QPixmap &pixmap, const int &img_id)
{
    auto ui = mainwindow_->get_ui();
    const auto all_images = mainwindow_->get_image_group()->GetAllImages();
    if(img_id >=all_images.size())
        return;

    auto list_preview = ui->list_previews;
    const QSize icon_sz = list_preview->iconSize();

    auto image = all_images[img_id];
    QListWidgetItem* list_item = new QListWidgetItem(QIcon(pixmap),str2qstr(image.get_name()));
    list_item->setSizeHint(QSize(icon_sz.width(),icon_sz.height()+10));
    list_preview->insertItem(img_id,list_item);
    list_preview->repaint();

}

void QUpdatePreviewThread::run()
{
    if(mainwindow_ ==nullptr || mainwindow_->get_image_group() ==nullptr)
    {
        return;
    }
    auto ui = mainwindow_->get_ui();

    const auto new_images = mainwindow_->get_image_group()->GetNewAddingImages();
    if(new_images.empty())
    {
        return;
    }
    const auto num_images = new_images.size();

    QImageReader reader;
    for(auto k=0;k<num_images;k++)
    {
        auto image = new_images[k];

        reader.setFileName(str2qstr(image.get_path()));
        reader.setAutoTransform(true);
        const QSize img_size = reader.size();
        const QSize icon_sz = ui->list_previews->iconSize();
        const QSize size_scale = img_size.scaled(icon_sz,Qt::KeepAspectRatio);
        reader.setScaledSize(size_scale);

        auto pixmap = QPixmap::fromImageReader(&reader);

        emit SingalAddPreview(pixmap,image.get_id());
    }

}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

以上就是Qt实战之实现图片浏览器的详细内容,更多关于Qt图片浏览器的资料请关注我们其它相关文章!

(0)

相关推荐

  • Qt+Quick实现图片演示器的开发

    目录 介绍 运行示例 创建主窗口 访问文件夹内容 在照片表面上显示图像 处理捏合手势 介绍 一个适用于触摸设备的QML应用程序,它使用一个带有FolderListModel的Repeater来访问文件夹中的内容,以及一个包含MouseArea的PinchArea来处理获取内容上的捏合手势. Photo Surface 演示了如何使用带有FolderListModel和FileDialog的Repeater来访问用户选择的文件夹中的图像,以及如何使用包含MouseArea的PinchArea处理同

  • 基于QT实现显示OpenCV读取的图片

    目录 1. 概述 2. 实现 2.1 代码 2.2 解析 3. 结果 1. 概述 OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,这里通过QT来显示OpenCV读取的图片. 2. 实现 在QtCreator中新建一个基于QMainWindow的应用: 其中QImageShowWidget就是用于显示图像的控件,它是继承于QWidget实现的,可以将其嵌入QMainWindow的centralwidget中: QImageShowWidget是自定义的

  • 基于Qt实现SVG图片浏览器

    目录 介绍 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 .pro文件 4.2 添加SvgWindow类 4.3 添加SvgWidget类 4.4 svgwidget.h头文件 4.5 svgwidget.cpp源文件 4.6 svgwindow.h头文件 4.7 svgwindow.cpp源文件 4.8 mainwindow.h头文件 4.9 mainwindow.cpp源文件 五.效果演示 介绍 SVG的英文全称是Scalable Vector Graphics,

  • QT实战之实现图片浏览系统

    目录 引言 实现功能 效果 实现图片浏览所用知识 实现流程 实现环境和UI设计 具体实现 引言 本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换:是一个标准的图像浏览软件. Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻.往下翻并且自动播放: 此系统增加一个列表: 实现功能 1.浏览电脑里的文件夹,将当前文件夹下的图片列表罗列出来: 2.鼠标点击列表上的某一张图片,图片将显示出来: 3.可以控制浏览当前图片的上一张和下一张: 4.实现鼠标拖动图片,左划,右划切换图片

  • QT实战之打开最近图片功能的实现

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 五.效果演示 一.项目介绍 本文介绍利用Qt和QSettings实现打开最近图片功能. 二.项目基本配置 新建一个Qt案例,项目名称为“RecentPhotoTest”,基类选择“QMainWindow”,取消选中创建UI界面复选框,完成项目创建. 三.UI界面设置 无UI界面 四.主程序实现 4.1 mainwindow.h头文件 头文件中

  • iOS开发中使用UIScrollView实现无限循环的图片浏览器

    一.概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 二.UIView 在熟悉UIScrollView之前很有必要说一下UIView的内容.

  • drag-and-drop实现图片浏览器预览

    今天刚试过chrome的drag and drop API,它能非常简单的将本地的图片放到浏览器中进行预览.试想一下当我们把一个文图片拖拽到浏览器里会发生什么事情,你的浏览器试图打开一个新的页面并加载这个图片.现在我不想浏览器这样帮我处理图片,我希望我拖拽的图片能立即放到我预先规定的位置并迅速回显,这就需要javascript中event对象的两个函数stopPropergation()和preventDefault().前者将会阻止事件的冒泡,后者会阻止浏览器默认的行为. 这里我们定义一个ig

  • iOS仿微博图片浏览器

    KNPhotoBrower 高仿微博图片浏览器 PhotoBrower.gif 一.功能描述及要点 1.加载网络九宫格图片,collectionView,scrollView 2.SDWebImage下载图片,KNProgressHUD显示加载进度 3.高仿微博,显示动画,KNToast提示 二.方法调用 1.创建KNPhotoBrower,并传入相应的参数 // 每一个图片控件对象, 对一一对应 KNPhotoItems ,再将多个KNPhotoItems 对象放入数组 KNPhotoItem

  • Android使用gallery和imageSwitch制作可左右循环滑动的图片浏览器

    效果图: 为了使图片浏览器左右无限循环滑动 我们要自定义gallery的adapter 如果要想自定义adapter首先要了解这几个方法 @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @O

  • 使用wxpython实现的一个简单图片浏览器实例

    上次我爬了n多图片,但是浏览的时候有一个问题. 图片浏览器的浏览一般都是按名称排的,而我对图片的命名是按照数字递增的.比如3总是会排在10后面,也就无法快速地浏览图片了. 所以,出于方便自己查阅图片,也出于学习,决定做一个自己的图片浏览器. 目标:浏览目录,通过滚轮不断显示同一个文件夹下的图片,并自定义排序. 步骤0:要实现图形界面,我使用wxPython. 至于如何安装和简单地使用wxpython,可以到网上检索,一大堆资料. 以下步骤默认你已经知道如何生成一个自己的frame. 步骤1:浏览

  • bcastr2.0 通用的图片浏览器

    bcastr2.0 是一款通用的图片浏览器,可以用于各种新闻系统或者blog系统. 主要功能:1.可以读取xml设置播放列表 2.可以不使用xml将图片地址直接写网页中直接 3.可以读取swf的动画格式 4.自动适应图片大小 5.循环播放,自定义自动播放时间 6.不限制图片数量 使用方法: 以下是嵌入网页中的2种方法 方法一,xml地址 复制代码 代码如下: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 

  • 来自ImageSee官方 JavaScript图片浏览器 原创

    使用方法: 访问"imagesee.htm的网址+?pic=图片的网址&page=该图片相关网页的网址" 即可,其中page参数可以忽略. 关于ImageSee: ImageSee是开放源代码的网页图片浏览器,由JavaScript写成,是一个完全静态网页.同时支持IE Firefox Opera浏览器. 透过ImageSee,您可以方便的对网上的高清图片(大图片)进行浏览,具备常规的图片浏览所需要的全部主要功能:放大缩小.缩略图.图片鼠标拖动. 更多特色: 完全免费开放使用,

随机推荐