日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

skia绘图

發(fā)布時間:2024/3/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 skia绘图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

路徑:

win32: LIBS += -LE:/skia/ -lskia.dll INCLUDEPATH += E:/skia INCLUDEPATH += E:/skia/skia DEPENDPATH += E:/skia

mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include "paintarea.h" #include <QMainWindow> #include<QImage> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: PaintArea* paintarea; }; #endif // MAINWINDOW_H paintarea.h #ifndef PAINTAREA_H #define PAINTAREA_H #include <QWidget> #include <QPaintEvent> #include <QRect> #include <QDebug> #include <QPainter> #include "include/core/SkBitmap.h" #include "include/core/SkCanvas.h" #include "include/core/SkTypeface.h" #include "include/core/SkRefCnt.h" #include "include/core/SkSurface.h" class PaintArea : public QWidget { Q_OBJECT public: explicit PaintArea(QWidget *parent = nullptr); sk_sp<SkSurface> rasterSurface = nullptr; //CPU上的surface void paintEvent(QPaintEvent *event); void initGroup(int w,int h); void drawshape(SkCanvas* canvas); signals: public slots: private: QVector<SkPath> path_shape; QImage image; SkImageInfo info; //圖片填充 QByteArray data; }; #endif // PAINTAREA_H main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } mainwindow.cpp #include "mainwindow.h" //#include <skia/src/core/SkAAClip.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { //QWidget* mainWidget=new QWidget(); paintarea=new PaintArea(); setMinimumSize(1000,1000); setCentralWidget(paintarea); } MainWindow::~MainWindow() { } paintarea.cpp #include "paintarea.h" #include <iostream> #include "include/core/SkPath.h" #include "include/core/SkRect.h" PaintArea::PaintArea(QWidget *parent) : QWidget(parent) { setPalette(QPalette(Qt::white)); setAutoFillBackground(true); setMinimumSize(500,500); //std::cout<<"1"<<std::endl; //update(); } void PaintArea::paintEvent(QPaintEvent *event) { Q_UNUSED(this); initGroup(width(),height()); //在此處進行初始化目的是在屏幕擴大時畫板緊跟擴大 rasterSurface->getCanvas()->clear(SK_ColorWHITE); auto canvas=rasterSurface->getCanvas(); canvas->save(); drawshape(canvas); canvas->restore(); image=QImage((uchar*)(data.data()),width(),height(),QImage::Format_RGBA8888); QPainter painter(this); painter.drawImage(0,0,image); } void PaintArea::initGroup(int w, int h) { info=SkImageInfo::Make(w,h,SkColorType::kRGBA_8888_SkColorType,kUnpremul_SkAlphaType); //image中的顏色存儲方式 size_t rowBytes=info.minRowBytes(); size_t size=info.computeByteSize(rowBytes); data.resize(static_cast<int>(size)); rasterSurface=SkSurface::MakeRasterDirect(info,data.data(),rowBytes); } void PaintArea::drawshape(SkCanvas* canvas) { SkPaint paint; paint.setAntiAlias(true); paint.setStrokeWidth(2); paint.setStroke(true); //顯示框架,如果為false則會默認填充(直線顯示會出現(xiàn)問題:無顯示,因為無可填充的位置) SkPath path_now; //SkRect rect=SkRect::MakeXYWH(x-100,y-100,200,200); //SkRect rect1=SkRect::MakeXYWH(x-100,y-100,200,100); SkRect rect=SkRect::MakeXYWH(100,100,100,100); SkPath path; path.addRoundRect({10, 20, 54, 120}, 10, 20); SkRect tests[] = { { 10, 40, 54, 80 }, { 25, 20, 39, 120 }, { 15, 25, 49, 115 }, { 13, 27, 51, 113 }, }; for (unsigned i = 0; i < SK_ARRAY_COUNT(tests); ++i) { SkPaint paint; paint.setColor(SK_ColorRED); canvas->drawPath(path, paint); bool rectInPath = path.conservativelyContainsRect(tests[i]); paint.setColor(rectInPath ? SK_ColorBLUE : SK_ColorBLACK); canvas->drawRect(tests[i], paint); canvas->translate(64, 0); //path_now.addRect(rect); //path_now.addOval(rect); //canvas->drawPath(path_now,paint); //qDebug()<<path_now.countPoints(); //qDebug()<<path_now.contains(150,150); //看點是否在path內(nèi)部或者邊線上 //qDebug()<<path_now<<endl; //canvas->drawPath(path_now,paint); //canvas->drawArc(rect,120,180,true,paint); //canvas->drawRect(path_now.computeTightBounds(),paint); //得到圖形的輪廓 /* //skia: SkPath& SkPath::close() paint.setStrokeWidth(15); paint.setStrokeCap(SkPaint::kRound_Cap); SkPath path; const SkPoint points[] = {{20, 20}, {70, 20}, {40, 90}}; path.addPoly(points, SK_ARRAY_COUNT(points), false); for (int loop = 0; loop < 2; ++loop) { for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style, SkPaint::kStrokeAndFill_Style} ) { paint.setStyle(style); canvas->drawPath(path, paint); canvas->translate(85, 0); } path.close(); canvas->translate(-255, 128); }*/ }

總結(jié)

以上是生活随笔為你收集整理的skia绘图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。