国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

QOpenGLWidget大圖查看器:紋理上傳、MVP矩陣與光標(biāo)縮放

QOpenGLWidget大圖查看器:紋理上傳、MVP矩陣與光標(biāo)縮放 簡介這份Qt示例工程面向具備一定C基礎(chǔ)、正在學(xué)習(xí)Qt與OpenGL圖形顯示的開發(fā)者聚焦QImage圖片在QOpenGLWidget中的紋理上傳與交互變換問題。壓縮包為rar格式共10個(gè)文件、約347KB以3個(gè)cpp和2個(gè)h源碼為核心配合ui界面、qrc資源、pro工程配置及jpg示例圖組成可直接參考的完整工程結(jié)構(gòu)。已有783人學(xué)習(xí)說明其在圖像顯示類練習(xí)中具有一定參考價(jià)值。工程內(nèi)容覆蓋initializeGL與paintGL的初始化與繪制流程、紋理過濾和邊角模式設(shè)置以及通過模型視圖矩陣實(shí)現(xiàn)縮放、旋轉(zhuǎn)和平移的思路同時(shí)結(jié)合鼠標(biāo)、鍵盤輸入更新變換參數(shù)并控制重繪以保持交互流暢。讀者可據(jù)此理解QImage轉(zhuǎn)紋理、視口適配和交互變換的組織方式作為圖像查看器或圖形界面二次開發(fā)的起點(diǎn)。1. QOpenGLWidget 貼圖這件事從 QLabel 換到 GL 畫布的那一步拿 QLabel 顯示圖片一開始都很順直到你放進(jìn)去一張 8000×6000 的掃描件。滾輪一放大QPixmap 要重新做一次 CPU 插值幾十毫秒就過去了按住鼠標(biāo)拖動(dòng)主線程直接被堵住畫面一卡一頓松手才啪地跳到最終位置。做圖像標(biāo)注、圖紙預(yù)覽、看圖工具這類要長時(shí)間盯細(xì)節(jié)的軟件這個(gè)體驗(yàn)基本沒法交付。換成 QOpenGLWidget 的思路其實(shí)很樸素讓 QImage 只走一次內(nèi)存到顯存的拷貝變成一張紋理之后所有縮放、旋轉(zhuǎn)、平移都只是改一個(gè) 4×4 矩陣?yán)锏膸讉€(gè)數(shù)重繪交給 GPU大圖縮放穩(wěn)定在一幀一次 draw call。這份源碼素材-template 拆的就是這個(gè)最小閉環(huán)四類操作背后只有一條數(shù)據(jù)鏈路和一組矩陣把這條鏈走通再加任何功能都是往上疊。適合剛接觸 Qt 與 OpenGL 的同學(xué)照著跑通也適合手上正有一個(gè) QLabel 看圖控件準(zhǔn)備換掉的開發(fā)者。2. 工程骨架與數(shù)據(jù)鏈路一張 QImage 走到屏幕要過哪幾道關(guān)2.1 四個(gè)環(huán)節(jié)解碼、上傳、變換、繪制整條鏈路拆開只有四步邊界清楚到可以用一句話描述QImage 在 CPU 側(cè)被規(guī)范化成 RGBA8888 并垂直翻轉(zhuǎn)通過 glTexImage2D 上傳成 2D 紋理繪制時(shí)用一個(gè)正交投影矩陣把像素坐標(biāo)系映射到 NDC再把平移、旋轉(zhuǎn)、縮放疊成一個(gè)模型矩陣最后畫一個(gè)和圖片等尺寸的四邊形采樣紋理輸出。四個(gè)環(huán)節(jié)各自有獨(dú)立的失敗點(diǎn)這是排查時(shí)最省時(shí)間的一張地圖環(huán)節(jié)關(guān)鍵函數(shù)典型失敗表現(xiàn)解碼QImage::load / convertToFormat通道錯(cuò)位、透明區(qū)變黑上傳glGenTextures / glTexImage2D黑屏、斜條紋、越界讀變換QMatrix4x4 組裝縮放跑偏、旋轉(zhuǎn)不繞中心繪制glDrawArrays shader有頂點(diǎn)無像素、上下顛倒很多人第一次寫會(huì)把這四步揉在 paintGL 里結(jié)果一改縮放就得重新傳紋理幀率立刻掉到個(gè)位數(shù)。正確的切法是上傳只在換圖時(shí)發(fā)生一次paintGL 里只做變換和采樣。2.2 類結(jié)構(gòu)與目錄組織工程不需要很復(fù)雜一個(gè)畫布類吃下所有 GL 相關(guān)代碼主窗口只管 UI 和文件對話框這樣二次開發(fā)時(shí)改動(dòng)面可控。目錄大致長這樣ImageViewerGL/ ├── CMakeLists.txt ├── main.cpp ├── widgets/ │ ├── ImageCanvasWidget.h # 畫布本體GL 代碼全在這里 │ ├── ImageCanvasWidget.cpp │ ├── ImageViewerWindow.h # 主窗口打開、復(fù)位、關(guān)于 │ └── ImageViewerWindow.cpp ├── shaders/ │ ├── image.vert │ └── image.frag └── resources.qrc # 把 shader 打成資源省掉運(yùn)行時(shí)路徑問題Qt6 里 QOpenGLWidget 已經(jīng)從 Widgets 拆到了獨(dú)立模塊CMake 配置少寫一行就是鏈接報(bào)錯(cuò)find_package(Qt6 REQUIRED COMPONENTS Widgets OpenGLWidgets) add_executable(ImageViewerGL main.cpp widgets/ImageCanvasWidget.cpp widgets/ImageViewerWindow.cpp ) # 注意 OpenGLWidgets 是獨(dú)立組件只鏈 Widgets 會(huì)在 QOpenGLWidget 構(gòu)造函數(shù)上炸 target_link_libraries(ImageViewerGL PRIVATE Qt6::Widgets Qt6::OpenGLWidgets) set_target_properties(ImageViewerGL PROPERTIES WIN32_EXECUTABLE TRUE MACOSX_BUNDLE TRUE )提示Qt5 用QT opengl就夠了Qt6 必須顯式找 OpenGLWidgets兩套 CMake 寫法不通用從舊工程遷移時(shí)優(yōu)先查這一行。畫布類的公開接口刻意收得很窄外層只認(rèn)識(shí)三個(gè)方法加載圖片、復(fù)位視圖、設(shè)置背景色。內(nèi)部狀態(tài)全部私有這樣后面加標(biāo)注層、加 ROI 框選時(shí)外部邏輯不需要知道矩陣怎么算。2.3 初始化順序initializeGL 里到底該放什么QOpenGLWidget 的三個(gè)虛函數(shù)有嚴(yán)格調(diào)用時(shí)機(jī)initializeGL只在上下文第一次成功建立后調(diào)一次resizeGL在尺寸變化時(shí)調(diào)paintGL每幀調(diào)。順序錯(cuò)了就是典型黑屏——在initializeGL之前調(diào)任何gl開頭的函數(shù)要么空指針要么靜默失敗。class ImageCanvasWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: explicit ImageCanvasWidget(QWidget *parent nullptr); ~ImageCanvasWidget() override; bool loadImage(const QString filePath); // 唯一換圖入口 void resetView(); // 復(fù)位縮放 1.0、旋轉(zhuǎn) 0、居中 void rotateBy(float degrees); // 相對旋轉(zhuǎn)供工具欄和快捷鍵調(diào) protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void wheelEvent(QWheelEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; private: void uploadTexture(const QImage img); // QImage - GL 紋理只在換圖時(shí)調(diào) void rebuildQuad(); // 按圖片尺寸重建頂點(diǎn)緩沖 QMatrix4x4 buildMvp() const; // 投影 * 模型逐幀組裝 GLuint m_texture 0; QOpenGLShaderProgram m_program; QOpenGLBuffer m_vbo{QOpenGLBuffer::VertexBuffer}; QOpenGLVertexArrayObject m_vao; QImage m_image; // 保留原圖導(dǎo)出/重傳都靠它 QSize m_texSize; // 原圖尺寸算初始縮放用 float m_scale 1.0f; // 縮放系數(shù)1.0 表示 1 像素對 1 像素 float m_rotation 0.0f; // 旋轉(zhuǎn)角度單位度逆時(shí)針為正 QVector2D m_translation{0.0f, 0.0f}; // 平移量單位屏幕像素 QPointF m_lastPos; // 上一幀鼠標(biāo)位置拖拽用 bool m_dragging false; };繼承QOpenGLFunctions是為了拿到跨平臺(tái)的 GL 函數(shù)指針集合——Qt 幫你做了QOpenGLContext::getProcAddress那一套你不必再引 GLEW 或 glad這在只有 Widgets 依賴的項(xiàng)目里很省事。代價(jià)是只能用 OpenGL ES 2.0 / 2.1 這個(gè)基線如果你要用 compute shader 或幾何著色器就得換成QOpenGLExtraFunctions或者自己加載。initializeGL里的順序不能亂void ImageCanvasWidget::initializeGL() { // 1. Qt6 必須顯式初始化函數(shù)解析表少了這行后面所有 gl* 都是空指針 initializeOpenGLFunctions(); // 2. shader 編譯鏈接失敗必須立刻暴露不要靜默跳過 if (!m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, kVertexShader) || !m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, kFragmentShader) || !m_program.link()) { qWarning(shader 編譯失敗: %s, qPrintable(m_program.log())); return; } // 3. VAO/VBO 只創(chuàng)建不填充頂點(diǎn)數(shù)據(jù)要等圖片尺寸確定后才能寫 m_vao.create(); m_vbo.create(); // 4. 固定管線那套混色狀態(tài)深色背景配半透明圖片時(shí)需要 glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }第 4 步的GL_BLEND是給帶 alpha 通道的 PNG 準(zhǔn)備的如果你只顯示不透明圖片這一行可以省。第 2 步的qWarning打印m_program.log()很關(guān)鍵——shader 編譯錯(cuò)誤不會(huì)拋異常只會(huì)在日志里留一行不打印出來就是純黑屏加一頭霧水。3. 核心渲染鏈路拆解紋理上傳、著色器與 MVP 矩陣3.1 QImage 轉(zhuǎn)紋理格式、對齊、翻轉(zhuǎn)三件事這是整個(gè)項(xiàng)目里最容易翻車的一段因?yàn)槿齻€(gè)坑全藏在兩行代碼里。QImage 的像素格式五花八門Format_ARGB32、Format_RGB888、Format_Grayscale8……OpenGL 只認(rèn)它自己那一套枚舉中間必須做一次格式收斂。選Format_RGBA8888是因?yàn)樗膬?nèi)存排布是 R、G、B、A 順序和GL_RGBA的期望完全一致不需要再做通道重排。void ImageCanvasWidget::uploadTexture(const QImage img) { // 1. 格式收斂RGBA8888 的內(nèi)存序和 GL_RGBA 嚴(yán)格對應(yīng)省掉通道交換 QImage normalized img.convertToFormat(QImage::Format_RGBA8888); // 2. 垂直翻轉(zhuǎn)QImage 原點(diǎn)在左上GL 紋理原點(diǎn)在左下這里翻一次 // 著色器里的 uv 就可以老老實(shí)實(shí)寫 (0,0)-(1,1)邏輯只留在一個(gè)地方 normalized normalized.mirrored(false, true); if (m_texture 0) { glGenTextures(1, m_texture); } glBindTexture(GL_TEXTURE_2D, m_texture); // 3. 行對齊寬度不是 4 的倍數(shù)時(shí)默認(rèn) 4 字節(jié)對齊會(huì)讀串行畫面呈斜條紋 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, normalized.width(), normalized.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, normalized.constBits()); // 4. 縮小時(shí)用 mipmap 三線性放大時(shí)用線性只用 GL_LINEAR 縮小會(huì)明顯閃爍 glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 5. 邊緣 clamp避免紋理采樣越界時(shí)出現(xiàn)半透明黑邊 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); m_texSize normalized.size(); m_image img; // 存原圖導(dǎo)出時(shí)不要再從 GPU 讀回來 }參數(shù)逐個(gè)說清楚GL_RGBA8是內(nèi)部格式8 位每通道夠用且顯存占用可控如果做醫(yī)療影像要 16 位精度這里換成GL_RGBA16同時(shí) QImage 那邊轉(zhuǎn)Format_RGBA64。glPixelStorei(GL_UNPACK_ALIGNMENT, 1)是必須的。寬度 3 的倍數(shù)、又不是 4 的倍數(shù)的圖比如 RGB888 的 1023 像素寬默認(rèn) 4 字節(jié)對齊會(huì)讓驅(qū)動(dòng)多讀幾個(gè)字節(jié)畫面直接變成斜著的色帶。這個(gè)現(xiàn)象非常迷惑因?yàn)閳D不大就完全正常圖一大就錯(cuò)。mirrored(false, true)和第二參數(shù)true是垂直鏡像。如果你不想在 CPU 側(cè)翻也可以在頂點(diǎn)數(shù)據(jù)里把 v 坐標(biāo)寫成1.0 - v但兩邊千萬別都做否則畫面上下顛倒回來又顛倒回去最后看起來正常一換圖就露餡。紋理尺寸還有硬限制GL_MAX_TEXTURE_SIZE在老舊集顯上可能只有 8192 或 4096。超過這個(gè)尺寸glTexImage2D直接報(bào)GL_INVALID_VALUE畫面全黑。工業(yè)相機(jī)、衛(wèi)星圖、切片掃描這類動(dòng)輒兩萬像素的材料很正常比較穩(wěn)妥的做法是分塊tile上傳或者先等比縮到合法尺寸再傳原圖留給導(dǎo)出用。3.2 頂點(diǎn)數(shù)據(jù)與著色器一張四邊形的完整定義幾何部分簡單到不需要索引緩沖四個(gè)頂點(diǎn)畫一個(gè) triangle strip 就完事。頂點(diǎn)坐標(biāo)直接用圖片像素坐標(biāo)0,0 到 w,h這樣正交投影矩陣寫起來最直觀鼠標(biāo)坐標(biāo)也能直接參與運(yùn)算不用來回做歸一化換算。void ImageCanvasWidget::rebuildQuad() { const float w static_castfloat(m_texSize.width()); const float h static_castfloat(m_texSize.height()); // 布局x, y, u, v 交叉排列一次 allocate 搞定位置和紋理坐標(biāo) const GLfloat verts[] { 0.0f, 0.0f, 0.0f, 0.0f, // 左上 w, 0.0f, 1.0f, 0.0f, // 右上 0.0f, h, 0.0f, 1.0f, // 左下 w, h, 1.0f, 1.0f, // 右下 }; m_vao.bind(); m_vbo.bind(); m_vbo.allocate(verts, sizeof(verts)); m_program.bind(); // 參數(shù)含義location0類型 float起始偏移 0每頂點(diǎn) 2 分量跨距 4 個(gè) float m_program.enableAttributeArray(0); m_program.setAttributeBuffer(0, GL_FLOAT, 0, 2, 4 * sizeof(GLfloat)); // location1從第 3 個(gè) float 開始2 分量跨距同上 m_program.enableAttributeArray(1); m_program.setAttributeBuffer(1, GL_FLOAT, 2 * sizeof(GLfloat), 2, 4 * sizeof(GLfloat)); m_program.release(); m_vbo.release(); m_vao.release(); }setAttributeBuffer的最后一個(gè)參數(shù)是 stride這里寫4 * sizeof(GLfloat)表示每隔 16 字節(jié)取下一個(gè)頂點(diǎn)。如果寫成 0讓驅(qū)動(dòng)自己推某些老驅(qū)動(dòng)會(huì)算錯(cuò)顯式寫死更保險(xiǎn)。location0 / 1是靠 shader 里的layout(location ...)硬綁定的兩邊必須對得上對不上就是純黑。兩個(gè) shader 保持最小// image.vert #version 330 core layout(location 0) in vec2 aPos; layout(location 1) in vec2 aTexCoord; uniform mat4 uMvp; out vec2 vTexCoord; void main() { vTexCoord aTexCoord; // 注意這里乘的是完整 MVP任何變換都在 CPU 側(cè)算好shader 不做二次加工 gl_Position uMvp * vec4(aPos, 0.0, 1.0); }// image.frag #version 330 core in vec2 vTexCoord; uniform sampler2D uTexture; out vec4 fragColor; void main() { fragColor texture(uTexture, vTexCoord); }片元著色器里不寫任何 if 和分支——GPU 最怕這個(gè)。如果你想加灰度化反色亮度對比度直接在texture()之后做一個(gè)mix或加減代價(jià)幾乎為零但如果寫if (vTexCoord.x 0.5)性能曲線會(huì)立刻變得難看。3.3 buildMvp平移、旋轉(zhuǎn)、縮放的合成順序矩陣這塊是玄學(xué)重災(zāi)區(qū)。QMatrix4x4 的乘法和數(shù)學(xué)課本一致但代碼里鏈?zhǔn)秸{(diào)用的順序和直覺是反的m.translate(); m.rotate(); m.scale();實(shí)際效果是先縮放、再旋轉(zhuǎn)、最后平移因?yàn)槊看握{(diào)用都在右乘新矩陣。設(shè)計(jì)意圖很明確圖片自己的坐標(biāo)系里先繞圖片中心縮放再繞圖片中心旋轉(zhuǎn)然后整體移動(dòng)到畫布中心并疊加用戶的平移量。所以順序必須是 translate → rotate → scale → 反向平移回原點(diǎn)。QMatrix4x4 ImageCanvasWidget::buildMvp() const { QMatrix4x4 proj; // y 軸向下bottom h, top 0和屏幕坐標(biāo)系一致 // 鼠標(biāo)坐標(biāo)可以直接當(dāng)世界坐標(biāo)用不需要再做 y 翻轉(zhuǎn) proj.ortho(0.0f, static_castfloat(width()), static_castfloat(height()), 0.0f, -1.0f, 1.0f); QMatrix4x4 mv; // 1. 把畫布中心 用戶平移量當(dāng)作圖片中心的落點(diǎn) mv.translate(width() * 0.5f m_translation.x(), height() * 0.5f m_translation.y()); // 2. 繞 Z 軸旋轉(zhuǎn)正數(shù)為逆時(shí)針 mv.rotate(m_rotation, 0.0f, 0.0f, 1.0f); // 3. 等比縮放 mv.scale(m_scale, m_scale); // 4. 把圖片自身中心挪到原點(diǎn) —— 少了這行縮放和旋轉(zhuǎn)會(huì)繞畫布左上角 // 表現(xiàn)就是放大時(shí)圖片往右下角飛出屏幕 mv.translate(-m_texSize.width() * 0.5f, -m_texSize.height() * 0.5f); return proj * mv; }第 4 行的反向平移是整個(gè)矩陣的靈魂。它的物理含義是把圖片坐標(biāo)系的中心挪到原點(diǎn)這樣第 2、3 步的旋轉(zhuǎn)和縮放天然繞中心發(fā)生。很多人圖省事把 scale 寫在 translate 前面代碼看起來只差一行運(yùn)行起來圖片就是繞著左上角放大越放越偏還以為是自己縮放算法寫錯(cuò)了。proj * mv的乘法順序也不能改投影矩陣在最左模型矩陣在右。寫成mv * proj的后果是畫面上什么都沒有且沒有任何報(bào)錯(cuò)。3.4 paintGL一幀的完整執(zhí)行順序void ImageCanvasWidget::paintGL() { glClearColor(0.13f, 0.14f, 0.16f, 1.0f); // 深灰底淺色圖邊緣更清楚 glClear(GL_COLOR_BUFFER_BIT); if (m_texture 0 || m_texSize.isEmpty()) { return; // 還沒加載圖片只清屏 } m_program.bind(); m_program.setUniformValue(uMvp, buildMvp()); m_program.setUniformValue(uTexture, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_texture); m_vao.bind(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); m_vao.release(); m_program.release(); }逐行解釋關(guān)鍵點(diǎn)setUniformValue(uTexture, 0)里的 0 是紋理單元編號(hào)必須和glActiveTexture(GL_TEXTURE0)對上對不上就是采樣到一張空紋理畫面純黑。GL_TRIANGLE_STRIP用 4 個(gè)頂點(diǎn)畫兩個(gè)三角形比GL_TRIANGLES少傳兩個(gè)頂點(diǎn)雖然在這里省不了多少但習(xí)慣值得保留。整個(gè)paintGL里沒有任何glTexImage2D這是幀率能穩(wěn)住的前提。換圖時(shí)才調(diào)uploadTexturerebuildQuad然后update()一次。4. 交互層實(shí)現(xiàn)滾輪縮放、拖拽平移與旋轉(zhuǎn)的坐標(biāo)換算4.1 鼠標(biāo)事件分發(fā)與狀態(tài)管理三個(gè)鼠標(biāo)事件各管一攤互不打擾左鍵按下開始拖拽左鍵移動(dòng)累加平移量滾輪改縮放系數(shù)右鍵拖拽改旋轉(zhuǎn)角。狀態(tài)用一個(gè)m_dragging布爾量 一個(gè)m_lastPos就能覆蓋不需要維護(hù)狀態(tài)機(jī)。void ImageCanvasWidget::mousePressEvent(QMouseEvent *e) { if (e-button() Qt::LeftButton) { m_dragging true; m_lastPos e-position(); // Qt6 用 position()Qt5 是 pos() setCursor(Qt::ClosedHandCursor); } QOpenGLWidget::mousePressEvent(e); } void ImageCanvasWidget::mouseMoveEvent(QMouseEvent *e) { if (!m_dragging || !(e-buttons() Qt::LeftButton)) { return; } const QPointF delta e-position() - m_lastPos; m_lastPos e-position(); // 平移量直接在屏幕像素空間累加和 ortho 的像素單位完全一致 // 中間不需要任何比例換算這也是選像素坐標(biāo)系的最大好處 m_translation QVector2D(static_castfloat(delta.x()), static_castfloat(delta.y())); update(); // 單幀請求重繪不要用 while 或 timer 去刷 } void ImageCanvasWidget::mouseReleaseEvent(QMouseEvent *e) { if (e-button() Qt::LeftButton) { m_dragging false; unsetCursor(); } QOpenGLWidget::mouseReleaseEvent(e); }e-position()返回的是邏輯像素DPI 無關(guān)而m_translation也是邏輯像素兩邊單位一致。如果你不小心一邊用了devicePixelRatio乘過的物理像素拖拽速度就會(huì)變成 2 倍或 0.5 倍高 DPI 屏上線普通屏上一切正?!@種問題最難查因?yàn)殚_發(fā)機(jī)往往是普通屏。4.2 以光標(biāo)為錨點(diǎn)的縮放最樸素的實(shí)現(xiàn)是滾輪一下m_scale * 1.15圍繞畫布中心放大。用起來會(huì)讓用戶很煩想看清楚畫面右上角的細(xì)節(jié)滾幾圈之后那塊內(nèi)容已經(jīng)跑到屏幕外面去了得不停拖回來。好用的看圖工具都做光標(biāo)錨定——放大時(shí)鼠標(biāo)指針下面那個(gè)像素點(diǎn)保持不動(dòng)。推導(dǎo)不復(fù)雜把屏幕坐標(biāo)到世界坐標(biāo)的映射寫成一行screen R · S · (world ? c) center t其中 R 是旋轉(zhuǎn)S 是縮放c 是圖片中心t 是平移量。要求縮放從 S 變到 S 之后同一個(gè) screen 對應(yīng)的 world 不變解出新的平移量t pivot · (1 ? k) t · k, 其中 k S/Spivot 鼠標(biāo)位置 ? 畫布中心落到代碼里只有六行void ImageCanvasWidget::wheelEvent(QWheelEvent *e) { const float steps e-angleDelta().y() / 120.0f; // 一格滾輪 120 if (qFuzzyIsNull(steps)) { return; } const float oldScale m_scale; // 1.15^steps往上滾放大往下滾縮小指數(shù)形式保證放大縮小完全對稱 m_scale std::clamp(oldScale * std::pow(1.15f, steps), 0.02f, 64.0f); // 錨定公式k 是新舊縮放比pivot 是鼠標(biāo)相對畫布中心的偏移 const float k m_scale / oldScale; const QPointF pos e-position(); const QVector2D pivot(static_castfloat(pos.x() - width() * 0.5), static_castfloat(pos.y() - height() * 0.5)); m_translation pivot * (1.0f - k) m_translation * k; update(); e-accept(); }幾個(gè)參數(shù)值得說明std::pow(1.15f, steps)里的 1.15 是手感系數(shù)試過 1.1、1.2、1.31.15 在大圖上大概是滾三格看清楚一小塊的節(jié)奏再大就容易失控。std::clamp的上下限 0.02 和 64 是防呆——低于 0.02 時(shí)一張 10000 像素的圖只剩 200 像素寬用戶會(huì)以為圖沒了高于 64 時(shí)浮點(diǎn)精度開始不夠用邊緣會(huì)出現(xiàn)抖動(dòng)。這兩個(gè)邊界值不是隨便定的是長時(shí)間試出來的。還有一點(diǎn)容易忽略公式里的pivot用的是畫布中心而不是圖片中心。這里有個(gè)前提buildMvp里平移量的基準(zhǔn)點(diǎn)也是畫布中心兩邊必須統(tǒng)一。要是某天你把基準(zhǔn)改成圖片中心這個(gè)公式就得跟著重寫。4.3 拖拽旋轉(zhuǎn)與視圖復(fù)位旋轉(zhuǎn)不用太花哨右鍵橫向拖動(dòng)改角度加上一個(gè)鍵盤 R 鍵做 90° 步進(jìn)覆蓋絕大多數(shù)用法。void ImageCanvasWidget::setRotationFromDrag(qreal dx) { // 每拖 2 像素轉(zhuǎn) 1 度符號(hào)取反是因?yàn)槠聊?y 向下、逆時(shí)針為正 m_rotation std::fmod(m_rotation - static_castfloat(dx) * 0.5f, 360.0f); if (m_rotation 0.0f) { m_rotation 360.0f; // 歸一化到 [0, 360)避免數(shù)值越滾越大 } update(); } void ImageCanvasWidget::rotateBy(float degrees) { m_rotation std::fmod(m_rotation degrees, 360.0f); update(); } void ImageCanvasWidget::resetView() { m_scale 1.0f; m_rotation 0.0f; m_translation QVector2D(0.0f, 0.0f); update(); }std::fmod那一步是后悔藥。如果不做歸一化用戶按住右鍵轉(zhuǎn)十圈m_rotation就變成 3600浮點(diǎn)精度一點(diǎn)點(diǎn)累積轉(zhuǎn)回 0 度時(shí)畫面會(huì)有微小傾斜。歸一化之后最多只有 359 的誤差肉眼看不出來。復(fù)位按鈕也別只復(fù)位縮放——把旋轉(zhuǎn)和平移一起歸零否則用戶點(diǎn)了復(fù)位發(fā)現(xiàn)圖還是歪的體驗(yàn)很怪。5. 避坑與排查黑屏、倒像、斜條紋、泄漏這四類問題5.1 環(huán)境與初始化類一進(jìn)來就是純黑現(xiàn)象程序能起來窗口也有但畫布區(qū)域一片黑什么都看不到日志里也沒有異常。原因絕大多數(shù)是initializeOpenGLFunctions()沒調(diào)或者 shaderlink()失敗后被靜默跳過。Qt6 里QOpenGLFunctions的函數(shù)指針要靠這個(gè)調(diào)用填充不調(diào)的話第一次glGenTextures就是空指針在部分平臺(tái)上直接崩在另一些平臺(tái)上靜默返回 0。另一個(gè)高頻原因是鏈接時(shí)只帶了Qt6::Widgets沒帶Qt6::OpenGLWidgets編譯期不報(bào)錯(cuò)運(yùn)行時(shí)構(gòu)造 QOpenGLWidget 才炸。解決把a(bǔ)ddShaderFromSourceCode和link()的返回值全部檢查失敗時(shí)用qWarning打印m_program.log()initializeGL第一行固定寫initializeOpenGLFunctions()。如果還是沒有輸出檢查QSurfaceFormat有沒有在QApplication構(gòu)造之前設(shè)置——setDefaultFormat必須在main里QApplication a(argc, argv);之前調(diào)之后調(diào)無效這是個(gè)經(jīng)典的時(shí)間窗口問題。5.2 畫面表現(xiàn)類圖片上下顛倒或出現(xiàn)斜條紋現(xiàn)象 A圖能顯示但是上下倒著的文字也反了。原因 AQImage 原點(diǎn)在左上、GL 紋理原點(diǎn)在左下兩邊坐標(biāo)系不一致。如果只在uploadTexture里做了mirrored(false, true)卻又在頂點(diǎn)數(shù)據(jù)里把 v 坐標(biāo)寫成1.0 - v等于翻了兩次看起來又正了一旦換一種加載路徑比如從內(nèi)存 buffer 而不是文件只走其中一處翻轉(zhuǎn)立刻就顛倒。解決 A翻轉(zhuǎn)只做一次且固定在一個(gè)地方。這個(gè)項(xiàng)目的做法是統(tǒng)一在uploadTexture里翻頂點(diǎn) uv 永遠(yuǎn)寫(0,0)-(1,1)誰改了翻轉(zhuǎn)邏輯必須同步檢查另一處?,F(xiàn)象 B圖片邊緣出現(xiàn)斜著的彩色條紋或者右下角有一片噪點(diǎn)。原因 BglPixelStorei(GL_UNPACK_ALIGNMENT, 1)沒寫驅(qū)動(dòng)按 4 字節(jié)對齊讀行寬度不是 4 的倍數(shù)的圖必然讀串行。解決 B上傳紋理前固定加一行g(shù)lPixelStorei(GL_UNPACK_ALIGNMENT, 1)。這個(gè)設(shè)置是全局狀態(tài)會(huì)一直保留但建議每次上傳前都設(shè)避免被別處改掉后踩坑。5.3 交互與數(shù)值類放大后圖片往角落跑現(xiàn)象滾輪放大幾次之后圖片不是圍繞光標(biāo)放大而是快速往右下角飛出去最后完全看不見或者拖拽時(shí)手感明顯黏跟手的距離對不上。原因buildMvp里少寫了最后那句反向平移mv.translate(-w/2, -h/2)縮放和旋轉(zhuǎn)就繞畫布左上角發(fā)生。拖拽黏的原因通常是單位不統(tǒng)一——e-position()返回邏輯像素而平移量如果按物理像素累加高 DPI 屏上速度就變成 2 倍。解決矩陣鏈的尾部必須補(bǔ)上把圖片中心移到原點(diǎn)這一步坐標(biāo)換算全程只用邏輯像素如果確實(shí)需要物理像素統(tǒng)一在resizeGL里乘一次devicePixelRatioF()別散落在各個(gè)事件處理里。檢查方法很簡單把m_texSize打出來再打印一次鼠標(biāo)位置經(jīng)過buildMvp().inverted()映射后的世界坐標(biāo)看看是不是落在[0, w] × [0, h]里。5.4 性能與資源類連續(xù)換圖幾十次后卡死現(xiàn)象反復(fù)打開不同的圖片內(nèi)存占用一路漲最后系統(tǒng)卡頓甚至進(jìn)程被殺或者大圖切換時(shí)有一秒多的白屏。原因glGenTextures每次換圖都新建紋理舊的沒glDeleteTextures顯存泄漏。另一種是每次paintGL都調(diào)glTexImage2D重新上傳一張 8000×6000 的 RGBA 圖每幀要拷 180MB 到顯存幀率自然崩。解決uploadTexture里先判m_texture ! 0就復(fù)用現(xiàn)有紋理 ID只在尺寸變化時(shí)重建paintGL里絕不重新上傳。如果是同一尺寸的圖頻繁刷新比如視頻幀用glTexSubImage2D替換整張glTexImage2D后者要重新分配顯存前者只覆蓋數(shù)據(jù)快一個(gè)數(shù)量級。析構(gòu)函數(shù)里記得makeCurrent()之后再glDeleteTextures直接刪會(huì)因?yàn)闆]有當(dāng)前上下文而失敗。注意QOpenGLWidget在銷毀時(shí)上下文可能已經(jīng)失效~ImageCanvasWidget里刪紋理必須自己makeCurrent()Qt 不會(huì)幫你。6. 二次開發(fā)從單圖查看器擴(kuò)到多圖層標(biāo)注器的改造思路這個(gè)畫布跑通之后最有價(jià)值的延伸是把它往多圖層方向改。單圖查看器的瓶頸在m_texture只有一個(gè)一旦要做底圖 標(biāo)注層 ROI 框選就得把紋理和矩陣抽成獨(dú)立的圖層結(jié)構(gòu)struct Layer { GLuint texture 0; QSize size; QMatrix4x4 localTransform; // 圖層自身的偏移/縮放相對畫布為恒等 float opacity 1.0f; bool visible true; }; QVectorLayer m_layers;改造的關(guān)鍵是把buildMvp拆成兩級投影矩陣proj全局一份每個(gè)圖層自己的模型矩陣單獨(dú)算繪制時(shí)proj * layer.localTransform逐個(gè)上傳。這樣拖拽平移只改全局的視圖矩陣單獨(dú)挪某個(gè)標(biāo)注框只改對應(yīng)圖層的localTransform互不干擾也不用重新上傳紋理。第二個(gè)常見需求是導(dǎo)出當(dāng)前視圖。不要用QPixmap::grabWidget那截的是窗口會(huì)被遮擋、被 DPI 縮放。正確做法是grabFramebuffer()它直接讀 FBO拿到的是純繪制內(nèi)容bool ImageCanvasWidget::exportView(const QString path) { makeCurrent(); // 讀 FBO 前必須綁定上下文 const QImage frame grabFramebuffer(); doneCurrent(); return frame.save(path); // 格式由后綴決定 }第三個(gè)方向是精度。如果做的是工業(yè)檢測、遙感、病理切片圖片動(dòng)輒兩萬像素以上GL_MAX_TEXTURE_SIZE直接卡死。這時(shí)要么按 2048 或 4096 切塊每塊一張紋理按可視區(qū)域只畫可見的塊視錐裁剪要么把原始QImage拆成金字塔縮放級別切換時(shí)換用不同分辨率的紋理顯存占用能壓下來一大截。這兩條路的共同點(diǎn)是始終保留 CPU 側(cè)的原始 QImageGPU 上的紋理只是顯示用的副本任何需要精確像素的操作取色、測量、導(dǎo)出都回到原圖算不要從紋理讀回來。關(guān)于驗(yàn)證我的習(xí)慣是準(zhǔn)備一組刁鉆圖當(dāng)回歸樣本一張 1×1、一張 1023×769寬度不是 4 的倍數(shù)、一張帶 alpha 的 PNG、一張 20000×20000 的大圖、一張灰度圖。每次改完矩陣或者紋理上傳邏輯就把這五張挨個(gè)過一遍縮放拖到 0.05 和 30 兩個(gè)極端右鍵轉(zhuǎn)兩圈看有沒有抖動(dòng)、有沒有黑邊、邊緣有沒有斜紋。這套流程是被坑出來的血淚經(jīng)驗(yàn)——只測一張 4K 的彩色 JPG永遠(yuǎn)發(fā)現(xiàn)不了對齊和格式的問題。從那以后我每次動(dòng)渲染相關(guān)的代碼都會(huì)在提交前把這組圖跑一遍寧可多花十分鐘也不想再收到大圖打開是斜的這種沒有截圖、沒有復(fù)現(xiàn)步驟的反饋。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
又黄又硬又粗又长国产视频| 日本操逼视频不卡直接放| 强免费黄色网址| 国产精品久久久吖| 91天美免费| 国产盗摄美女如厕大神作品在线观看| 激情综合五月丁香| 91爆操视频| 日韩av无码网站| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日本伦乱九九九综合| 天天澡天天爽日日av| 亚洲欧美激情在线视频| 久久国产逼| 夜夜嗨一区| 做爱福利视频一区二区| 又摸又舔在线观看网站| 亚洲性爱高潮影院| 屌逼传媒| 欧美青青视频| 91老司机在线视频免费观看| 黄色AAAAAAAAAAA大片| 国产乱子伦一区二区三区在线观看| 亚洲三级网址久久最新| 视频二区美腿丝袜制服人妻欧美| h在线看免费版在线看| 久久久久亚洲?V片无码V| 国产成人在线观看网址| 91老熟妇| 国产强奸乱伦无码视频| 欧美色999| 精品少妇高潮久久| 久久一区二区蜜桃| 免费国产视频| 肏逼视频日本| 欧美呦呦性爱| 日韩av不卡在线看| 国产麻豆福利av在线播放| 中文字幕97| 日韩一级二级三级| 91社区伊人| 欧美97| 亚洲国产精品V?在线播放| 白丝AV| 97综合在线| 国产精品一区二区亚洲人成毛片| av日韩国产一区二区| 9丨亚洲一区二区在线| 日夜伊人网| 成人国产二区三区在线,男女精品。| 99热这里只有精品1| 制服丝袜第二页| 国产地址二三| 国产AV天美传媒一区二区三区 | 嫩草在线视频| 97国产高清视频在线观看| 亚洲精品毛片在线观看| 伊人网综合在线视频| 郑州宾馆老熟女露脸啪啪| 91动漫操逼视频| 国产伦精品一区二区三区在线观| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 免费一级黄色录像影片| 亚洲欧美经典一区二区| 另类视频在线| 超碰天天操| 97操综合| 伊人黄色视频免费观看| 久久亚洲婷婷| 变态另类专区| 欧美性爱精品七区| 国产精选三级在线观看| 在线黄色污污网站| 黑白配性爱AV成| 免费精品无码一级毛片牛牛影视| 富女玩鸭子一级毛片| 久9re热视频这里只有精品| 日韩无码精品综合久久| 激情视屏国产乱伦强奸| 黑操B| 啊啊啊啊二区好大| 蜜臀久久99精品久久久久久成人小说| 国产无码精品久久久久久| 无码日韩人妻av一| 午夜精品久久久久久久99热影院 | 另类图片欧美激情综合| 国产福利精品最新在线| 国产av高清版| 日韩干B| 操国产逼| 六月丁丁香| 日韩性爱1级片视频| 天天激清| 凸凹视频在线观看| 嗯啊不要在线| 欧美日韩色| 亚洲欧美日韩免费电影| 婷婷五月天av| 精品无码人妻一区二区免费蜜桃| 天天综合青苹果| 性爱乱伦视频免费| 婷婷情色综合网| 999久久久久久久久| 自拍偷拍草一草| 免费黄色视频网址| 91热热色| 国产精品成人无码av| 91女人的网站| 欧美999| 国模精品一区二区三区苹果色戒 | 日韩亚洲美女一区久久| 精品视频一区二区| 亚洲色图大香| 91内射| 婷婷丁香六月| 97色香蕉| 欧美操人| 日韩欧美加勒比| 柠檬AV导航| 人人摸人人舔一区二区| 无码人妻一区二区三区色欲aⅴ | 1024精品在线| 欧美日韩夜夜| 日韩欧美午夜一区二区| 久久超碰av在线| 日韩 欧美 视频 在线 一区| 77国产精品| 在线有码中文字幕| 精品欧美日韩在线观看| 欧美综合娱乐久久| 久久久久9999精品九九九| 人人操欧美风骚| 成人五月香网在线| av毛片aaaaa免费看| 91在线无码精品秘 软件| 密臀AV在线| 在线一道啪| 任你干在线视频| 亚洲成人福利电影免费| 激情文学小说一区二区 | 天天做天天爱| 91人妻少妇| 久无码| 欧美一区二区三区四区综合| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 男人的天堂在线有码| 久久久久ab| 天天弄天天操| 玖玖大干人妻| 日韩二三区| 黄色片A级一区二区三区| 午夜福利久久久噜久噜久久综合 | 成人三级片无码| 精品人妻15区| 黑人天8A∨高清网站| 粉嫩av平台| 男人的天堂无码| 九九伊人网| A一区片| 在线亚洲丝袜视频网站| 99热综合| 欧美顶级黄色大片免费| 大香蕉日韩| 91在线免费观看处女| 99久久精品无码一区二区毛片免费 | 久久一本大香蕉 | 亚洲熟妇极品| 综合久久六月久久婷婷| site:sinbotex.com| 日韩 人妻 精品| 日韩欧美中文| 99re免费视频精品全部| 超碰人妻97| 久久夜嗨| 欧美亚洲国内自拍| 手机看片1024你懂的国产| 99热这里只有精品18| 欧亚不卡| 日韩天美| 97啪啪| 大但人体久久久久| 99黄页网站| 亚洲人妻一区二区三区| 国产一区二区三区白丝| 天堂亚洲欧美| 天堂亚洲精品| 亚洲男人天堂视频| 黑白配性爱AV成| 激情欧美日韩女同久久| 中文字幕在线播放2中文字幕在线观看2 | 内射小黄片| 国产400孕妇孕交群| 天天日天天舔东京热 | 九七毛片九九毛片| 欧美少妇高潮久久91| 激情五月天色播| 特级毛片特黄久久免费看 | 久久9久9久99久9久9| 成人免费不卡在线视频| 久综合国内精品自在自线| 亚洲欧洲日韩中文字幕一区| 蜜臀99999| 精品夜夜澡人妻无码| 日本成人电影资源网| 小说区 图片区色 综合区| 色偷偷2020免费视频播放| 亚州中文字幕超碰97| 殴美牲| 一区二区激情国产熟女| www.久久| 精品一区二区3区| 丁香六月婷| 中文字幕在线免费观看视频| 在线观看黄色电话| 日韩AV无码中文一区二区| 人妻9117c| 日韩无码视频黄色| 天天视频网站黄| 婷婷干黄色| 日韩日本欧美在线观看| 精品人妻一区二区三区四区不卡在| 99日视频在线免费| 中文字幕一区二区无码成人| 97超级色碰碰| 亚洲脚交| 综合网91| 超碰在线观看av不卡| 7777奇米影视久久| 国产粉嫩出水在线播放| 婷婷亚洲天堂| 久久久99久9| 亚洲欧洲精品成人| 成人a级高清视频在线观看| 看免费一级在线播放毛片| 一起草三级AV电影在线观看 | 亚洲中文人妻色| oumeisetupian| 久久婷婷在线观看视频| 国产极品久久久| 国产乱子伦一区二区三区免看| 韩国女主播青草在线| 国精综合一二三区影视| 加勒比色综合| 久久系列| 91在线视频观看国产| 久久久久久国产精品免费网站| 精品国产丝袜一区二区三区乱码| 在线啊v一区| 五月婷婷六月激情| 久操在97| 日韩97P| 免费人成毛片乱码| 成人无码影片视频在线| 午夜久久一区二区无码中出| 超碰97在线 欧美 国产| 人伦四五区| 曰韩中文人妻视频| 精品v日韩欧美国产| 伊人五月天| 久久久18禁| 老熟女综合网| 95自拍视频在线观看| 欧日a| 日韩欧美加勒比| 丰满人妻无码一区二区三区| 欧美性爱五月天| AV高清一区| 九九热精品| 亚洲欧美自拍偷拍| 欧美亚洲20p| 易易A毛视频| 在线观看免费视频国产| 天天摸,夜夜摸| 69久久久久久久久久久久久| 天天日天天干天天摸天天操| 性爱综合一区二区| 69人妻人人揉人人躁人人精品| 亚洲限制级| 大香蕉78| 啊啊啊用力在线观看| 久久久性少妇| 亚洲精品官网在线观看| 欧美精品偷拍| 人妻啪| 老女人爆菊| 亚洲综合在线第一页| 午夜偷拍久久熟女| 青青草精玖玖69精品| 九九热九九| 18禁超污无遮挡无码免费网| 久操操| 国产精品爆乳懂色蜜乳| 婷婷色五月激情| 亚洲色图 综合| 嫩呦国产一区二区三区AV| 女一区二区| 国产粉嫩蜜臀av一区二区三区| 性爱av在线免费观看| 一区二区视频你懂的| a级免费在线观看| 色哟哟国产精品免费网址| 美女爽到高潮91| 欧美性爱五月天| 99精品九九九九九九| 91天堂色男人的天堂| 小明看看网址| 一级特级aaaa毛片免费观看| 日韩9999| 色情乱伦AV| 骚日日av| 成人情色一区二区| 国产精品96| 亚洲色图20p| 精品久久久av无码免费| 97超碰巨乳| 国产中文字幕曰本毛片| 在线 欧美 亚洲| 色五月婷婷久久| 久久系列| 亚洲男人的天堂AV| 3028国产精品| 国产97av| 干b在线性社区| 久久精品国产99精品亚洲蜜...| 国产传媒1234区| 9国产超碰| 任你干在线视频| 无码伊人久久大杳蕉中文无码| 91天天综合在线| 成人夜夜爽| 欧美爱三级日韩久久| 淫骚熟女一区二区三区| 伊人久久大香大香线蕉中文| 96超碰网| 91久久堂| 91在线页| 人人插人人摸人人| 天堂无码| 综合网亚洲1| 97亚洲综合电影| 成人三一级一片aaa| 九九九九九九九九九九九蜜桃| 黄色性爱网网| 麻豆三极片| 亚洲天天影视色综合| 色情五月综合婷婷| 亚洲天堂AV在线播放| 日韩精彩视频| 日韩美女久久一区二区三区| 蜜乳av一区二区| 果冻传媒A片麻豆熟妇人妻| 日韩伦理久 久久 清纯| 91麻豆va国产精品| 亚洲日本激情| 亚洲欧美色图| 精…码一二三区| 亚洲日韩XXX| 亚洲AV免费在线观看| 性色av蜜臀av色欲aV| 国语少妇精| 最新9久久久9免费视频| 91天美传媒精品| 色色亚洲| 99热只有这里有精品| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 亚洲色图欧美色图日韩色图| 日日躁夜夜躁狠狠躁超爽| 97 国产一区| 97精品国产97久久久久久| 97久久久精品| 欧美天天谢综合网| 蜜桃精品一区二区三区ww| 人、人、摸,人、人、草| 久久久久久久强迫| 婷婷五月天激情四射| 91天天美女| 日本免费一区二区不卡| 97人人爱人人做人人乐| 中美日韩毛片| 久久亚洲天天做| 玖色AV| 五月综合激情| 五月婷婷综合网| av资源在线播放天堂| 欧美性巨大╳╳╳╳╳高跟鞋| 综合亚洲欧美精品日韩?v| 97在线免费看视频| 超碰欧美| 美女熟妇色| 中文字幕,人妻,日韩| 色波多| A级片日韩欧美国产欧美视频精选观看| 黄页av| 亚洲色图欧美| 精品人成视频在线观看| 黄色免费一级在线毛片| a片久久久久久久久久久久 | 91AV天堂| 大但人体久久久久| rivers-china.com| 2017天天插| 噜噜噜噜久久久精品免费| 18精品一二区| 九九AV| 免费看片黄| 日本一级婬片试看三分钟| 欧美爱三级日韩久久| 亚洲激情在线观看一区| 韩国午夜理伦三级好看| 思思热免费视频观看| 亚洲成熟国产精品美女| 亚洲免费看片| 青青草在线视频人人想人人上| 97久精品| 职场同事知名国产国产精品久久欧美日韩| 国产熟女自拍| 在线视频亚洲无码| 日本午夜福利影院| 啊啊啊好湿国产一二| 91夜夜蜜桃臀1区2区3区| 成人一区二区三区四区| 日韩不卡一二三四| 亚洲欧美97| 国产91会所女技师在线观看| 黄色AAAAA欧美| 亚洲亚洲亚洲天堂天堂 | 日本肉体xxxx裸交| 欧美性暴力猛交XXXX| 校园春色亚洲无码| 人妻久久一区二区三区| 国产无吗在线播放| 欧美在线干| 日本999精品| 蜜臀久久99精品久久久久久成人小说 | 一区二区乱码福利| 国内毛片国产专区二| 欧美男人一区| 色在线69堂| 欧美激情激情xxxx欧美专区| 性爱视频啪啪啪啪| 精品久久一区二区三区四区五区| 天操老女人| 色欧美综合| 久久免费精品视频免一| 看日韩美女二区三区免费操逼视频| 亚洲男人的天堂一区二区| 亚洲一区制服诱惑| 樱花蜜乳av| 人妻碰碰碰碰碰碰| 中文三一区| AAAAAAAAA黄片| 成人在线视频二区| 国产丁香精品露脸视频| 黑人嘿嘿嘿超爽免费视频| 嗯嗯啊啊视频在线看| 超碰免费欧美7| 亚洲精品免费中文字幕| 国产精品交换一区二区| 欧美日韩精品青青| 欧美一级久久久久久久大片动画| 无码一区二区三区四区五区六区七区八区九区十区视频 | 天天综合欧美| 大香蕉综合在线| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 秋霞一级鲁丝片A片| 在线观看精品国产免费| 四虎在线播放| 丝袜熟女一区二区三区| 成人精品一区二区三区| 日韩强奸av| 日夜啪电影| 久久春色| 禁止观看美女黄| 啊啊啊啊啊啊啊啊视频| 99热欧美| 老熟女91视频| 蜜臀在线免费观看在线免费观看| 91精品人妻一区二区三区蜜桃| 精品中文字幕一区二区l - 百度| 欧美亚洲AN| 性饥渴少妇av无码毛片| 午夜啊啊啊| 午夜精品久久久久久久久久蜜桃| 欧亚第一综合网| 一级AV性爱| 歐美性天天| 日本日逼高清| 啊啊啊啊,啊啊好多水| 嫩草一区二区在线观看| 日韩 欧美 国产 麻豆| 日韩精品免费高清视频在线| 亚洲精品骚逼| 人人摸人人摸人人干| 亚洲性综合| 国产成人自拍视频在线| 九九九九九九九九九国产精品| 亚洲成人久久美女| 人妻欧美| 久偷拍| 操比国产| 久久久97| 欧亚揄拍偷拍精品视频| 国产福利影视| 国产美女高潮| 九九九草| 久久久久久久极品香蕉视频| 91精片| 97天天弄| 9九九九九视频在线观看| 丰满人妻一区二区三区色-百度| 淫色网综合| 成人性爱高清视频免费看| 国产精品一区在线播放| 手机av天堂久久久久| 日本一区二区三区欧美日韩中文字幕| 男女日B国产| 亚洲一区制服诱惑| 日韩乱码Av| 免费观看国产不卡av| 日韩欧美天堂| 日韩AV一区二区三区三州三州| 中文精品一区二去| 久久精品熟妇丰满人妻99| 人妻插插人妻人| 91动漫操逼视频| 久操视频在线观看| 日韩人妻精品| 国产农村妇女精品一| 尤物一级在线免费观看| 国产精品96| 国产天天噜一噜久久久| 91在线综合网| 六月天婷婷| 国产高清在线观看欧美| 亚洲av青草久久一区二区| 一区二区国产视频在线观看| 97色色视频| 在线综合色| 天天射天天操天天干天天吃2018| 中文字幕国产| 日韩精品大香蕉伊人在线| 97天天爽| 色色色热| www.夜夜操| 国产精品一区二区 尿失禁| 人人操欧美风骚| 中文字幕三四五区| 欧美男人的天堂| 超碰无码五月97| 五月天久久婷婷亚洲 | 亚洲免费人妻在| 欧美性爱日韩性爱| 国产美女裸体秘 永久无遮挡| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 亚洲欧美日韩有码| 2025亚洲男人天堂| 国产乱婷婷精品二区三区| 亚欧高清v| 亚洲一级特黄大片在线播放91| 日韩av在线精品观看| 久久xxxx| 午夜男人一级A片7777| 人人操人人搞人人草| 久久只有精品| 丰满人妻被猛烈进入中| 97干色| 夜夜欢天天干| 欧美中出| 精品日韩人妻视频| 国产特级毛片AAAAAA高潮流水| 免费试看60秒| 国产v亚洲v日韩v欧美v片另类| 天天综合官网| 国产乱子伦一区二区三区在线观看| 日本久久久久久久久久| 免费男人的天堂| 伊人国产AV| 亚洲精品97久久| 丝袜美腿亚洲| 亚洲色图尤物视频| 乱伦3P视频| 日韩人妻一区二区精品| 狠狠色丁香| 亚洲 欧美 中文 日韩超碰| 男人的天堂2018东京热啪啪啪| 亚洲精品视频二区| 欧美爆操91| 无码男人天堂| 9美女超碰在线免费观看| 日韩欧美中文字幕搭讪巨乳美人妻视频| 男人的天堂99| 色在线综合| 男人a天堂手机在线版| 国内毛片国产专区二| 很很热性爱视频| 啊啊啊啊一区| 伊人aaa| 欧美高清91| 亚洲中字幕日本一区二区三区| 日本一区二区三区午夜观看| 国产无码高清操逼视频| 亚洲精品亚洲人成在线麻豆| 亚洲精品久久久久久久蜜桃臀| 五月婷色| 青青草成人视频在线观看二区| 98超碰日本| 亚洲高清自拍| 无码精品蜜桃一区二区三区ww| 97香蕉碰碰人妻国产欧美| 亚洲第一页色| 亚洲日韩黑丝| 美女熟妇色| 尹人大香蕉视频在线| 91在线色| 这里都是精品在线观看| 久久久久久久极品香蕉视频| 久久久久久久78| 东京热毛片调教| 国产黄色在线播放观看| 91丝袜美女国产| 日本熟妇色熟妇在线视频播放| 97超碰大| 国产一区在线免费播放| 啊好大好舒服| 亚洲熟女综合一区二区| 可能人人看人人摸| 四季AV综合网址| 天天综合中文字幕 91| 成人性爱视频在线看| 91neishe| 精品国产乱码久久久| 日本免费人成视频播放120秒| 丁香五月成人| 亚洲久久天堂| 亚洲码专区| 日韩视频小说在线观看| 操东北女人| 日韩精品99999| 亚洲精品国产拍免费91在线| 精品人妻一区二区三区四区石在线| 综合啪啪| 加勒比综合在线| 在线v中文字幕一区二区三区 | 91国产伊人大香蕉| 国产精品视频一区二区三区八戒| 一区麻豆 高清中文字幕| 欧美 亚洲| 久久精彩视频| 欧美日韩另类激情图片| 狼人久草| 欧美 色 亚洲| 国产精品一区人妻精品阁在线| 亚洲,欧美,综合网| 国内毛片无码一级毛片| 少妇蹲下买菜露大唇0| 亚洲精品影视老司机| 人妻爽爽啪视频| 国产高清无码一区三区二区| 真实高潮91| 亚洲欧洲成人在线电影| 野狼激情网| 国产亚洲色停停久久99精品91| 日本二三四区| 亚洲综合另类| 中文字幕97| 人妻精品一区二区全免费| 久久人妻| 激情欧美日韩女同久久| 无码最新| 亚州色图欧美色图| av天天在线观看| 欧美日韩国产一区二区小黄片大全| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | com 首页 18岁 禁区 女优 免费 精选 同城 | 蜜桃精品一区二区三区久在线| 色伊人91| 美女高潮国产高清| 国产高清不卡视频| 多乙久久久久久| 78m啪啪啪| 国产13区| av天堂手机版追回| 在线97视频| 精品亚洲俞拍视频一区| 国产午夜激片Av毛片不卡| 国产日韩中文字幕欧美| 激情五月丁香五月| 18禁在线视频| 99精品在线| 91九九九馒头| 日逼国产| 国产精品人妻无码久久久互動交流| 亚洲不卡av在线| 午夜理论片在线观看免费| 日本免费二区三区| 欧色综合| 亚洲成av人片色午夜乱码| 99热在线观看| 亚洲丰满很很操| 人人手机欧洲亚洲国产人妻| 女人与公拘交酡2020视频| 啊啊啊啊好疼视频| 久久久亚洲精品电影免费看| 韩国三级一线观看久| 五月婷婷青青草娱乐伊人| 男女国产精品| 成人一区二区三区四区| 五月婷婷基地| 中日亚韩免费视频| 97亚洲精品| 91青青在线| 99精品丰满人妻| 亚洲色图91欧美日韩| 欧美精品一区二区少妇免费A片| 色网亚洲人| 先锋音影AV| 97 亚洲 日韩 欧美 在线| 五月天丁香婷婷综合网站| 精品一区二区三区丰满熟女-亚洲欧美一区| 亚洲永久永久永久永久一级一级一级精品 | 国产性爱在线视频一区二区| 亚洲图片视频小说| 新视频sss国产| 熟妇人妻一区二区| 校园春色 男人天堂 | 久久久久国色αv免费观看| 白丝jkav| 91伊人大香蕉| 少妇毛片久久| 偷拍欧美激情| 欧美另类色图片| 婷婷啪啪| 亚洲中文字幕网| 亚洲精品人妻吞精av| 国产操伦| 日本一区二区三区午夜观看| 天啪| 欧美性91| 亚洲一二三四区| 97 色综合| 亚洲男人天堂2017| 亚洲无码一区成人免费午夜| 亚洲天堂日本| 偷拍片久久| 久久夜精品一区二区三区| 青青草视频久久久久| 91久久国产综合久久| 免费黄色片子| 日韩精品区二区三区不卡| 亚洲经典啪啪| 狠狠爱综合网| 日韩精品国产精品五码一区二区| 亚洲欧美激情在线视频| 白嫩国模丰满一二三区| 中国一区二区亚洲人妻| 亚洲日韩美国人妻| 国产精品自在线发布| 欧美另类精品xxxx| 国产aⅴ无码片毛片一级网站| 福利操逼| 日本欧美亚洲高清在线看| 亚洲成人一区二区精品| 中国zzijzzijzzwww精品| 欧美精品99久久久**| 午夜啪啪片| 自拍偷拍2025在线观看| 色狠狠综合| 欧美人妻精品| 超碰 av 女人天堂| 欧美中字不卡| 久久啊啊| 在线观看不卡一区二区三区| 在线播放成人高清免费视频| 欧美人与动性人交a| 欧美五十路熟| 五月天婷婷基地| 99这里有精品| 美女干逼2| 春色91| 国产丝袜美女在线一区| 成人aⅴ一区二区三区| 国产一区二区欧美日本| 天天插天天插| 久久婷婷亚洲欧| 中文字幕1区2区| 久久精品国产亚洲AV清纯| 久久天天艹| 九九伊人网| 黄色高清久久无码依人| 国产精品国产| 欧美精品二区视频在线| 色官网色综合| 性站| 久久久久久免费电影| 亚洲不雅视频1区二区| 情趣丝袜无码操逼视频| 尤物一级在线免费观看| 免费观看欧美日韩操逼视频| 丁香五月天婷婷姐| 少好三P| 被窝影院午夜看片无码| 国产精品久久久久av| 国产60区。| 亚洲中文丝袜美腿诱惑字幕| 91 欧美| 无码国产精品午夜不卡(| 人人色人人射人人妻| 久久精品99久久久久久| 日日摸天天爽夜夜欢| 日本视频一区二区三区| 综合网,亚洲,欧美| 天天爽入口| 国产成人午夜视频网址| 少妇二级| 久草电影网| 国产亚洲女v在线观看| 久久久九97| 国产日韩美女小穴视频网站不卡| 欧美综合国产精品久久丁香| 激情看片网站| 制服中出中文人人精品| 精品无码久久久久久久杏吧| 国产成人免费观看在线视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 一起草三级AV电影在线观看 | 岛国1区2区3区在线观看| 久久久久婷婷| 加勒比久久av| 天天做日日做天天欢。| 大香蕉欧美伊| 91精品人妻偷情| 99热色这里只有精品| 九九九不卡| 超碰人人超在线观看| 天天插夜夜爽| 欧美精品一区二区少妇免费A片| 欧美美女啪啪视频| 水多多映视AV| 婷婷三区| 激情小说图片亚洲首页| 天天日少妇逼AV| 怡红院成人视频| 伊人久久在线视频观看| 青青草视频久久久久| 国产品精品自在在线午夜免费| 国产在线视视频有精品| 国产精品3| 欧美日韩性爱操大逼| 操曰本熟女| 色成人Www精品永久观看| 最新av在线| 国产精品久久久久亚洲av| 好舒服视频| 一级啊性爱在线视频| 无码操逼天堂| 影音先锋国产精品| 久草免费在线视频| 天天肏美女| ,成人免费啪啪视频| 97色视频在线| 手机在线人成免费视频| 亚洲不卡一| 香蕉久久国产AV一区二区| 中韩中文字幕在线观看| 97在线视频观看| 大学生美女口爆| 人妻在线大香蕉| 午夜欧美女人操逼| 99999久久精| 大香蕉伊人亚洲| 伊人久久在线视频观看| 欧美综合 站| 久9视频| 熟妇综合一区二区三区| 久久精品视频28| 久久亚洲AV成人精品无码| 中出在线视频| 国语人妻精彩刺激| 91深夜夜| 四虎影视欧美| 香港日本韩国人妇99www.wccm20| 亚洲国产精品有声| 国产后入式在线观看| 日本久久久久久久久| A一区片| 国产精选视频| 欧美日韩一干二干| 97啪啪| 一二三四视频中文字幕在线看| 欧美综合777| 亚洲精品97在线| 亚州AV无码国产精品| 天天综合青苹果| 亚洲色入欧美| 91天天日| 欧美性爱精品一区二区| 视频国产欧美在线播放| 久久九操在线观看| 荡小穴在线观看| 麻豆国产96在线| 精品国产91内射久久| 四虎av在线| 丝袜av一区二区三区| 五月综合激情网| 国产91精品福利在线| 91色拍| 97中文综合| 熟女一区二区三区| 啊好大好舒服| 狠狠爱综合网| 亚洲古典另类欧美在线| 天天澡天天爽日日AV| 国产日产欧产美韩系列麻豆免费| 日本天天吊| 大香蕉久操| 免费的黄片wwwwww| 亚洲精品尤物yw在线影院| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 无码伊人久久大杳蕉中文无码| 91精品国产91久久福利| 欧美在线亚洲| 久久中文字幕女同性恋一区| 旡码电影特区| 人人人人人人少妇| 日本综合久久| 精品人人插人人操| 亚洲一卡2卡3卡4卡乱码网站| 91视频伊人| 91狠狠综| 97AV在线观看| 网友自拍第1页| 色区97| 精品日日人妻| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 精品人妻av区天天看片| 久久久三区二区一区| 亚洲吊色| 99只有精品| 精品无码久久久久| yy少妇精品久久| 9精品久久| 久久精品视| 无码人妻系列少妇| 综合九九| 日本熟妇自慰性高潮一区二区三区| 一区二区三区无卡视频在线观看| 日韩三级网址| 久久嫩草国产成人一区| ,国产乱人伦精品一区二区三区| 青草视频在线看看看看看看看看看| 操婷婷逼| 长长久久88视频| 东北夫妻性偷拍| 欧美色997| 97一区二压| 久久↗↗| 肥佬影院91| 热思思免费视频| 国产精品人人爽人人做可爱福利| 成人五级久久| 亚洲av影音先锋| 97婷婷色| 小草精彩毛片| 加勒比日本在线| 色色青青久久| 大香蕉日韩| 国产无吗在线播放| 国产三区免费在线观看| 人人爱人人操人人性| 日韩欧美亚洲一区二区三区影院| 国产成人久久久精品免费AV| 青青操轻轻| 亚洲精品丝袜-不卡成人免费……| 欧美色偷拍| 欧美乱妇狂野欧美在线视频| 伊人 俄罗斯 a v| 嗯嗯嗯啊啊在线观看| 国产精品久久久亚洲第一牛牛_在线观看 | 欧亚久久偷拍视频| 国产精品3| 亚洲色图一区二区三区| 久久这里只精品免费福利| 欧美一区二区三区入口| 亚洲综合中文字幕有码| www.夜夜操| 日韩精品9999| 97亚洲综合在线| 国产婷婷综合在线观看| 人人操人人搞人人草| 色婷婷九月| 伊人久久大香蕉线AV五月天| 欧美色图 人妻| 揉揉日日日日| 377p欧洲日本亚洲大胆| 色一情一乱一乱一区91Av| 99999精品视频| 97人妻人人躁人人玩人人| 亚洲精品久久久久毛片A片拉屎 | 欧美亚洲尤物久久| 人妻加勒比东京热| 97视频新免费| 国产91影院| 国产 丝袜 欧美中文 另类| 国产伊人自拍| 久久久少妇诱惑精品视频| 天天综合97| 九九综合久久| 男人天堂综合| 国产视频人人网| 99久久网站| 亚洲丰满很很操| 蜜乳AV免费观看| 久久久爆乳翘臀一线天伦理视频| 亚洲第91页| 久久伊人最新网址视频| 无码自拍SM| 激情小说亚洲图片| 1000部熟女视频在线观看| 亚洲精品日韩国产欧美| 超碰在线人妻不卡| 97超碰久久| 一区二区 韩日AV| 国产熟码AV| 日韩探花精品在线视频| 韩国女主播青草在线| 999999精品| 激情综合网五月婷婷| AV丝袜东京热| 麻豆国产视频精品观看| 精品国产乱码久久久久久影片| yazhouzaixian| 色狠狠 - 百度| 天天摸夜夜操视频| 国产日韩无码一区二区三区久久区| 思思99热| 97欧美综合网| 大香蕉人妻| 亚洲情色 自拍| 久久五月丁香| 高清无码学生妹高潮| AA特级绝黄| 久久精品中文字幕女同| 最新岛国大片| 亚洲第91页| 色综合天天| 亚洲色图 综合| 天天视频黄网站| 无卡一区=区| 日韩中文字幕在线视频观看| 国产精品视频| 久久av一级av少妇av高潮| 欧美在线55555| 97人妻免费中文字幕| 18岁禁 茉莉成人久久| 一个人免费视频观看在线WWW| 国产不卡精品91| a男人的天堂久久一级A毛片| 狠狠久久亚洲欧美专区| 超碰欧美97| 99热综合在线| 成人小说视频在线精品欧美| 久久久久久久久久久97| 精品人妻免费观看| 超碰99热中文字幕| 亚洲AV无码AV吞精久久久久| 日日AV加勒比| 日本东京热加勒比久久| 蜜臀aV午夜一区二区三区| 青娱乐国产精品| 中国zzijzzijzzwww精品| 国产熟女一区二区丰满| 亚洲高清无毛一区二区| 欲射影视| 成人性爱全视频观看| 91久久久久| 麻豆天美电影一区二区| 亚洲 欧美 精品专区 极品| 亚洲欧洲精品成人| 国产精品久久久久久久黄无码| 亚洲。天堂。日本在线观看| 日韩无码黄色片| 色路综合| 青娱乐大香蕉| 国产高清无码一区二区三区四区皇冠| 午夜精品久久久久久久第一页按摩| 骚货人妻偷情自拍在线视频| 久久久久久久人妻丝袜| 夜夜爽妓女| 熟女久久久| 色婷婷激一区二区三区 | 色哟哟AⅤ| 亚洲综合九| 五月婷婷五月天| 中文字幕日韩电影人妻| 久久久久久9999| www.久久| 欧美综合娱乐久久| 美女9118禁| 亚洲素人网| 9/A片| 日韩 欧美 视频 在线 一区| 日韩精彩视频| 第二页中文字幕| 影音先锋国产精品| 日本三级A片网站com| 国产蜜臀在线| 狠狠热这里都是精品| 天天色综合天天操| 无码137片内射在线影院| 蜜桃臀一区二区三区久久| 青青青操| www久久99| 亚洲天堂人妻熟妇视频| 亚洲天堂加勒比| 99国产精品自在自在| 色哟哟国产精品免费网址| 日韩在线观看字幕精品| 91啦人妻| 久草这里只有精品| 日本五区不卡| 亚洲欧美日韩电影网站一区| 99精彩视频| 欧美网站免费| av天堂天堂av日韩| 国产捆绑一区| 欧美91在线| 美女久久久久久久久久久| 激情婷婷丁香| 超碰久久草| 欧洲精品在线播放| 亚洲不卡不卡中文字幕不卡 | 九色97| 国产一级片| 亚洲日本韩国在线| 97人妻免费中文字幕| 亚洲日韩国产精品| 野狼福利社区| 九久精品| 国产97亚洲| 五十路三区在线| 性色A∨91| 日韩欧美加勒比| 超碰色综合| 少妇被c 黄 免费观看| 老熟女91视频| 蜜臀久久99精品久久久久久婷婷 | 啊啊啊啊啊啊在线观看| 精品人妻15区| 男人的天堂Va| 亚洲高清欧美总合| 啊啊啊好大好深| 91精品网站| 色图综合网| 日韩性爱一级片| 亚洲成人精品在线一区| 国产精品久久久啊| 日本精品一级二级三级| 91久久久亚洲| 黑人精品XXX一区一二区| 欧美日韩国产一区二区小黄片大全|