日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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 和文件對(duì)話框這樣二次開發(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); // 相對(duì)旋轉(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 像素對(duì) 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)紋理格式、對(duì)齊、翻轉(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)格對(duì)應(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. 行對(duì)齊寬度不是 4 的倍數(shù)時(shí)默認(rèn) 4 字節(jié)對(duì)齊會(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é)對(duì)齊會(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 ...)硬綁定的兩邊必須對(duì)得上對(duì)不上就是純黑。兩個(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è)。如果你想加灰度化反色亮度對(duì)比度直接在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)對(duì)上對(duì)不上就是采樣到一張空紋理畫面純黑。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(); // 單幀請(qǐng)求重繪不要用 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 對(duì)應(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ù)形式保證放大縮小完全對(duì)稱 m_scale std::clamp(oldScale * std::pow(1.15f, steps), 0.02f, 64.0f); // 錨定公式k 是新舊縮放比pivot 是鼠標(biāo)相對(duì)畫布中心的偏移 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é)對(duì)齊讀行寬度不是 4 的倍數(shù)的圖必然讀串行。解決 B上傳紋理前固定加一行g(shù)lPixelStorei(GL_UNPACK_ALIGNMENT, 1)。這個(gè)設(shè)置是全局狀態(tài)會(huì)一直保留但建議每次上傳前都設(shè)避免被別處改掉后踩坑。5.3 交互與數(shù)值類放大后圖片往角落跑現(xiàn)象滾輪放大幾次之后圖片不是圍繞光標(biāo)放大而是快速往右下角飛出去最后完全看不見或者拖拽時(shí)手感明顯黏跟手的距離對(duì)不上。原因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ù)量級(jí)。析構(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; // 圖層自身的偏移/縮放相對(duì)畫布為恒等 float opacity 1.0f; bool visible true; }; QVectorLayer m_layers;改造的關(guān)鍵是把buildMvp拆成兩級(jí)投影矩陣proj全局一份每個(gè)圖層自己的模型矩陣單獨(dú)算繪制時(shí)proj * layer.localTransform逐個(gè)上傳。這樣拖拽平移只改全局的視圖矩陣單獨(dú)挪某個(gè)標(biāo)注框只改對(duì)應(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拆成金字塔縮放級(jí)別切換時(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)不了對(duì)齊和格式的問題。從那以后我每次動(dòng)渲染相關(guān)的代碼都會(huì)在提交前把這組圖跑一遍寧可多花十分鐘也不想再收到大圖打開是斜的這種沒有截圖、沒有復(fù)現(xiàn)步驟的反饋。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产黄a三级三级三级av在线看| 久久久久女教师免费一区| 91 丝袜在线观看| 国岛片视频| 亚洲欧美综合图片| 九九九久久久久| 亚洲精品九九九| 伊人网在线观看| 日本一区二区做爱的视频| 欧洲视频在线| 色妇91| 综合网色| 26uuu性| 日韩小电影| 91电影色诱| www.久久| 乱伦av.com| 亚洲欧美激情小说| 日韩 成人 有码| 乱伦日本色图AⅤ| 精品一区二区三区国产| 日日骚一区二区三区| 91老熟女老女人国产老太| 五月婷婷六月色| 国产亚洲精品农村妇女| 啪啪视频免费在线观看| 老司机午夜精品视频| 久久东京热成人| 欧美成人综合| 美女久久久| 少妇色综合| 久久久久ab| 激情专区综合| 欧美刺激色黄片免费看| 国产三级多多影院2022国产AA一级毛片无码 | 五月天社区| 亚州免费啪啪视频| 成人国产视频在线观看| 风月影院十八禁| 美欧色综合| 久久精品六区| 亚洲天堂一二| 天天天肏屄肏屄肏屄欧美欧美| 亚洲涩图欧美| 国内外内射高清视频| 国产人妻一区二区三区欧美毛片| 美女97超碰| 久久精品视频久久久| 99色视频| 欧美第一页性| 校园春色制服丝袜中文字亚洲| 免费夜夜爱黄色视频毛片| 青青操狠狠撩| AV天堂丝袜| 无码男人天堂| 蜜臀99久| 在线播放一级无码视频| 日本欧美亚洲高清在线看| 三级特黄60分钟播放| 欧美五十路熟| 性色av婷婷久久一区二区点复制| 色呦呦呦在线观看视频| 热久久91婷婷| 东北丰满熟女国产一区| 92福利社视频| 欧美精品久久| av网站在线看| 在线无码操| 东京日日夜夜| 1000午夜黄色| 国产精品不卡av免费在线观看| 免费αV在线视频| 丁香五月激情综合国产| 欧美色图成人网一区二区| 老鸭窝日丰县女人| 影音先锋少妇| 深爱五月天| 亚洲揄拍网| 亚洲精品乱码久久久久久蜜桃麻豆| 美女诱惑久久| 乱论91| 中文字幕第页| 97一区二压| 欧美性爱一区二区三区| 一级黄色视频网| 2020中文字幕| 亚洲丝袜二区在线| 日本人人操人人操| 久湿久久 | 国产精品麻豆免费视频| 亚洲一区二区麻豆影院| 韩日精品四区| 久久久久人| 精品欧美老熟女一二区| 天堂8在线新版官网| 女人天堂AV五区在线| 蜜臀久久99'精品久久久| 91精品国产91综合久久蜜臀| 久久色情| 一本色道久久综合精品婷婷| 国产又大又硬又长又粗| 日韩av色图| 人妻夜夜爽天天爽三区麻豆AV网站| 日本性交操一区二区不卡系列| 婷婷五月天成人网| 欧美日日人人天天| 1人人看人人摸人人操| 超碰三级秋霞| 欧美色另类| 一区二区三区欧美激情| 狠狠干2020| 伊人精品久久网站| 加勒比海成人视频网| 囯产精品久久久久久久久久梁医生 | 欧美少妇色图| 日本999精品视频| 操碰97| 性色综合网| 欧亚免费视频| 欧美日韩小说| 亚洲第一页色| 可免费观看的av毛片中日美韩| 婷婷综合五月天| 久久久999国产精品| AV污污污污| 99精品网站| 久久在线观看免费视频| 强上我不卡卡| 大香网站| 五月情色天| 9超碰免费| 樱花蜜乳av| 欧美91精彩| 精品国产91av一区二区三区| 日韩一级二级三级免费看完整版国语版 | 亚洲色图 91| 五月天婷婷基地| 午夜精品久久久久久久第一页按摩| 婷婷五月天AV| 少妇久久久久久久久| 久久久99久9| 欧美成年人性爱视频免费观看| AV高清一区| 久久伊人亚洲AV无码网站| 男人天堂黄片| 青青草原成人| 天无日色综合| 午夜120视频在线观看| 男人天堂网手机版婷婷| 亚洲成人一二三区| 综合自拍| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 国产精品成人无码av| 天天日天天看| 久久久精品,3| 精品人妻一区二区三区-国产精品| 91香蕉视频在线观看免费| 国产精品视频播放| 曰韩无码777| 思思热国产高清| 丁香五月天久久精品视频一区二区三区| 人人摸.人人色| 欧美亚洲韩国视频十五区| 天天影视色香色欲| 国产 v乱码一区二| 国内毛片欧美香蕉精品| 色路综合| 人妻激情在线视频| 亚洲国产综合久久天堂| 亚洲无码AV九九九| 亚洲毛片一级带毛片基地| 婷婷伊人网| 国产精品ww久久| 91视频综合在线| 日韩美脚一区二区网站| 日亚韩精品视频二区三| 天堂俺去俺来也www久久婷婷| 久久高清无码夜夜操| 久操视频免费在线观看| 亚洲操逼网| 伊人一区二区在线播放| 亚州一区二区| 全国男人天堂网| 大香蕉伊在线久草麻豆天堂故事| 99精品视频在线观看| 99re热有精品视频国产| 国内偷拍精品一区二区| 91精品人| 97极品无码| 久久噜噜噜精品国产亚洲综合| 亚洲淫色网中文| 天天欲望网| 日日AAvv| 久久综合九九| 国产中午字一暮区| 天天干天天日天天射黄色| 激情五月天插| 男人天堂资源| 久久产精品一区二区三区电影| 日韩欧美资源| 亚洲啪啪综合?v一区综合精品区| 中文字幕免费观看| 操迟操逼在巾线Fre看| 亚洲精品欧美专业| 欧美九一精品久久久熟妇| 国产农村妇女精品一| 性久久久| 99久久精品国产高潮| 精品二区久久| 亚洲成人色情五月天丁香花| 亚洲图片激情综合另类| 日韩三级视频一区二区三区| 亚洲不卡AV在线| 中文字幕二区日韩天堂| 亚洲极品| 久久久亚洲Av| 美国一区二区三区视频| 日欧亚洲二三区大片不卡| 日本一区视频在线观看| 亚洲国产尤物yw在线观看| 国产精品无码av在线| 3p国产欧美99热| 精品区9| 亚洲限制级在线| 蜜桃一区二区三区| 中文字幕第7页| 欧美日韩传媒| 日本精品免费一区二区三区四区| 日韩精品作爱导航| 亚洲综合网91| 二男一女成人A片| 中文字幕av亚洲在线| 蜜臀久久久久久999| 成人久久精品| 亚洲色天堂九9| 亚洲成人精品在线一区| 日本性爱少妇| 97超碰色色| 亚洲麻豆精品二区三区| 久久久久久久人妻| 大香蕉伊利av| 一级岛国大片| 一卡二卡三卡| 97综合在线| 亚洲一卡二卡在线免费| 日韩午夜国产| 久99在线免费观看视频| 人人爱人人乐人人操| 久久精品国产72国产精品福利| 亚洲91少妇| 综合少妇网| 另类 日韩 熟女| 亚洲天堂人人妻| 日韩欧美亚洲自拍偷拍| 啊…啊…操我用力操我| 91男人综合| 不卡免费av在线播放| 青木玲在线不卡| 91人妻精华帖| 亚洲麻豆18发?| 精品亚洲国产成人av网站| 青女在线| 欧美性爱伊人| 色天使AV天堂| 久久xx| 97欧美日韩综合| 亚洲欧美精品一区天堂久久 | 婷婷五月丁香五月| 国产三级在线现体验区| 欧美大香蕉专区网| 人人操人人操人人人操| 香港久久久| 91丨熟女丨丰满熟女| 丰满人妻一区二区三区大胸懂色| http://qxhbdz.com| 天天日日日射| 日韩性爱毛片操骚逼| 久久妇| 亚洲无码99| 日本黄色精品专区网站| 超碰午夜| 久久久九97| 操日韩第| 97天堂| 中文字幕一品色图| 6080yy午夜理论三级一区二区三区无码| 中文字幕一区二区三区50路| 91美女色视频亚洲| 色综合美国| 亚洲综合中文字幕有码| 香蕉国产精品麻豆亚洲欧美日韩| 在线播放中文字幕| 超碰99热中文字幕| 大胆91| 国产一区二区欧美日本| 人人玩人人添人人澡免费| 欲色综合| 熟女熟妇一区二区三区视频| 五月天伊人| 亚洲一区二区三区欧美日韩| 久久久一区二区三区麻豆| 精品少妇人妻av久久免费| 男女啪啪网站免费视频| 国产精品久久久久久久无码AV| 97干天天| 中文字幕一区二区免费在线| 黑人精品成人一区二区三区 | 黄色小视频日本txt| 91骚妇| 摸奶性爱视频网站在线免费播放| 久久精9| 午夜AV人气不卡| 欧中美三级一区二区三区| 欧美制服另类丝袜| 欧美性爱1080p| 国产丝袜啪啪| 视频二区熟女人妻| 欧美激情视频一区二区三区不卡| 欧美性爱视频免费一区一A| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 日韩人妻免费精品| 综合97| 亚洲欧美国产精品久久久久久久| 精品久久久九九九孕妇| 99热日本| 人妻久久久久久| 欧美大波激情xxxx| 襙一襙| 91操熟女视频| 曰本特级特黄特色黄色A级网站高清在线免费看 | 综合网欧| 青青草日本无码| 精品v日韩欧美国产| 欧美黄页| a亚洲欧美色欲| 97亚洲欧美日韩| 亚州色交| 亚洲性综合9| 日本91白丝| 偷拍欧美激情| 欧美久久九九| 丁香色婷婷| 搞中出久久| 久久五十路熟女人妻| 大二网站亚洲| 嗯啊抽插大香蕉网页| 在线看片国产精品每日更新| 国模精品一区二区三区苹果色戒| 色色无码| 欧美亚洲性爱一区二区| 国产精品肉丝自拍| 精品无人区麻豆乱码1区2区图片| 9999久久久久| 91大神精品长腿在线观看网站| 久久草草亚洲蜜桃臀| A V视频日本| 日本123区操B视频| 99re95| 国产蜜臀在线| 麻豆尤物视频网| 国产v亚洲v日韩v欧美v片另类 | 巨爆乳一区二区爆乳区| 九色97| 国产白丝在线| 密臀成人视频久久久| 国产精品午夜福利视频| 91精品人妻一区二区三区蜜桃臀| 亚洲大胆人体av| 亚洲综合一| 五月天亚洲网| 男女性感激情网站| 九九久久国产精品| 7777奇米影视久久| 日韩国语字幕| 一区二区中文| 好淫网一二三视区| 黑人性欧美| 乱伦3P视频| 中文字幕在线观看第二页| 久久久久人| 91快色色色色色| 精品十三区| 国产福利一区二| 亚洲欧洲偷拍一区| 少妇熟女1区2区3区| 伊人99热| 97色在线视频| 欧美少妇一区二区三区| 蜜臀99久久| 日韩紧密久久| 天天日天天搞天天干| 日韩国产十八禁| 成人性爱免费播放| 裸体1区| 福利操逼| 欧美丝袜中文字幕07在线| AV九九| 91久久青青草原精品| 99亚洲精品| 97天天摸天天爽| 91狠| 玖玖玖玖精品国产剧情| 老色鬼成人精品视频下载大在线观看| 久操91视频| 亚av顶级裸体一区二区三区四区五区 | 家庭乱伦国产| 久操视频在线| 亚洲av总站| 浪人综合网| 日韩综合97p| 欧美aaaaaaa| 78操B| 日韩ab网 | 国产女人极品高潮毛片| 风间由美日韩欧美久久| 区一在线观看| 婷婷丁香五月激情啪啪| 国产强奸乱伦xd| 亚洲亚洲亚洲天堂天堂| 和协无码影院| 911av网站免费观看| 亚洲无码一二三区| 另类视频在线| juliaann丝袜大战黑鬼| 久艹免费| 97在线视频观看网站| 亚洲国产欧美中文永久| a男人的天堂| 天天热精品| 就去色综合| 日韩精品在线放| 96久久精品一二三区色欲| 婷婷久草一区二区三区| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 久热伊人99re| 中文字幕熟女人妻丝袜丝| 91香蕉国产尤物视频| 无码日韩人妻av一| 欧美综合色站| 国产激情视频一区区三区| 强奸乱伦中文字幕AV| 日产狠狠干| 91色堂| 欧洲黄色网| 五月丁香影院| 韩日巨乳美女免费视频在线观看| 超碰97精品| 国产 三级自拍| 日韩欧美被操黄免费观看| 九久精品| 91啪啪| 综合色久欲| 色五天伊人| 少妇天堂网络| 国产在线能看的你懂的| 人妻少妇视频在线播放| 久久久久久无码人妻中文字幕| 免费的黄片有限公司| 蜜桃久久综合视频| 91第一页| 丁香六月婷| 一区二区三区四区五区久久久久久| 精品久久久久久无码| 一区二区你上我| 91精品国产91熟女| 丁香五月性爱| 啪啪啪综合| 久久婷婷五月| 97超碰9| 午夜免费视频1000| 国产精品操| 精品妇女一区二区三区| 中欧人妻丝袜中文字幕| 国产按摩一区二区三区| 国产精品乱码久久| 亚洲精品久| 国产高清自拍| 日本999精品视频| 一级性爱视频免费观看 | 亚洲综合在线91| 日本中文字幕在线电影| 久久久久女教师免费一区| 国内精品久久久久影院亚洲| 色九九久九九| 大香蕉色十月| 久久 国产 无码| 日日夜夜草草草| 97在线视频观看网站| 欧美午夜视频| 午夜男女爽爽爽在线视频| 蜜桃久久一区| 国产高清1234区| 欧美不卡在线一区二区| 97在线资源| 日韩性爱高清免费视频| 久久精品店| 国产老熟女| 欧美操逼熟女| 亚洲美女精品九九视频| 婷婷伊人一区| 黄色片大香蕉| 精品午夜福利导航| 熟女网站最新| AV中文在线可看| 最新av网站在线观看| a片亚洲一本通视频| 国产 v乱码一区二| 91精品国产91久久青草| 亚洲欧洲无码97久久精品| 黄色一级视| 亚洲色综合| 偷拍片久久| 九九九九久久久| 在线综合 亚洲 欧美中文字幕| 久久精品中文字幕女同| 久久久影院| 亚洲一本色道中文无码aV天美| 亚洲熟妇A V黑人| 日本99一区二区| 丰满的三级少妇欧美久久久| 亚洲无线码欧洲精品区别| 97国产精品在线观看| 九九十八精品| 久操婷婷| 把腿张开老子CAO烂你| 国产精品国产精品国产| 少妇精品久久久八区九区| 日本免费不卡二区| 91美女中出| 国产精品久久久久中文字幕| 亚洲av综合伊人久久| 久久久久久久久9| 中文字幕十五区| ′ !γ}丶。。久久精品欧美一区二区三区 | 嗯啊抽插大香蕉网页| 国产强奸无码乱伦| 蜜臀99久| 亚洲丝袜在线观看| 婷婷丁香人妻| 91精品操美女| 亚洲女人毛茸茸91| 日韩噜噜69| 日本不卡三级网在线播放| 日本九九九九| 97最新在线播放视频| 操逼逼中文字幕| 狠狠操狠狠插| 欧美强奸乱能| 国产99精品一区二区三区免费| 伊人网高清| 熟女91网| 亚洲色图第四色| 欧美在线大香蕉| 日韩精品.久久精品.AV女优.天美传媒| 91强热人妻| 国产一区二区在线播放量| 9118禁| 极品少妇久久久| 亚洲加勒比色图| 久操av在线| 日本东京热大香蕉a片| 日本免费不卡二区| 熟女啪啪视频| 女生自91网站| 91久久久老司机| 啊啊啊啊啊啊啊在线| 成人在线视频一区| 97超碰这里只有精品| 日韩无码AB| 91欧美另类| 夜夜免费视频| 東南亚性呦成人伦理资源在线视频| 桑老女人九区| 精品无码少妇| WWW.操逼.COM| 性暴力欧美猛交在线直播| AV一起草在线| 国产精品视频一区二区三区八戒| 欧美成人一区二区三区在线播放| 偷窥自拍亚洲天堂网爆| 久久综合婷婷| 精品女人999| 日韩二三区| 日本一片一区| 亚洲成人帖图| 大JI巴好深好爽又大又粗视频| av网站国产主播在线| 日日噜噜夜夜狠狠视频无| 不卡啪啪视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 26uuu性| 婷婷中文网| 天美国产精品| 亚洲日韩东京热一区| 校园春色 亚洲| 亚洲精品久久久久毛片A片拉屎| 成人无码在线视频网站| 国产吞精a级片激情电影| 国产原创自拍| 都市激情人妻一区二区青青操视频| 天天干夜夜| 国产美女高潮| 国产欧美亚洲精品a第2页| 999久久久九| 国产91丝袜在线播放蜜月| 久久精品熟女亚洲AV麻豆软件| 欧美αv.com| 亚洲男人天堂Av| 新视频sss国产| 亚洲加勒比久久日本道| 日韩欧美俄罗斯A片| 日韩欧美麻豆大片| 情色大香蕉| 欧美一区二区三区入口| 91视频国品一二三区| 大香蕉伊然在亚洲91| 国产高清成人免费视频| 国产成人精品日本亚洲语言| 一区二区三区四区姦女| 欧美美女视频| 五月香婷婷| 91欧美丨精品丨入口| 东京热一区二区中文字幕| 最近的最新的中文字幕视频| 一区二区 电影 亚洲| 黄页av| 操逼日韩无码| 欲色啪| av在线不卡一区二区三区| 啊啊啊 在线观看| 国产白丝AV| 5278欧美一区二区三区| 久湿久久 | 亚洲精品 欧美精品| 国产高清自拍视频| 玖玖综合.com| 91一区二匹| 婷婷五月成人| 日本熟妇人妻一区二区三区| 五月综合婷婷久久网站| 人妻黑丝袜电影| 2017人人操,人人摸| 婷婷五月天久久精品视频一区二区三区| 青青草一区二区高清无码视频| 久久精品国产亚洲AV高级北京| 操学生天天| 手机在线免费看的av| 人人摸人人干| 尹人免费观看视频在线| 黑丝日韩av丝袜av| 国产a片操逼| 久久亚洲熟妇在线视频| 午夜操逼不卡| 啊啊啊啊啊啊啊网址在线观看| 中文字幕一区电影在线观看| 日韩精品系列| 日本福利二区视频| 97日亚洲欧美| 日本亚洲vr欧美不卡高清专区| 九七超碰| 抽查国产福利主播| 久久无码成人| 亚洲色图第四色| 日韩黄色电影网站| 熟女熟妇一区二区三四区| 五月天开心网| 亚洲**2021在线观看| 91中文精品日韩欧美在线| 精品欧美А∨无码黑人大荫蒂| 男人的天堂日本东京热| 国产女性无套 免费观看| 精品国产99999| 色女女女导航| 素人一区二区三区日韩| 人妻喷水| 亚洲 欧美 中文 日韩超碰 | 97日视频| 日韩AC| 成人怡红院| 亚洲第91页| 动漫爆乳3D奶水一区在线观看| 91爱啪| 操人妻逼91| 人人妻人人狠人人| 亚洲高清自拍| 乱久久久| 口爆综合网| 不卡av在线中文字幕| 久久久久久久久女黄| 99re这里只有精品中心播放 | 欧美亚洲se91| 欧美激情综合| 久久青青草原免费视频| 久久久久国色αv免费观看| 亚洲熟妇丝袜在线观看| 最新中文字幕在线亚洲| 无码人妻1727| 久久视频,这里只有精品| 蜜臀av在线播放一区二区三区| 一区二区三区在线美女| 99re黄| 国产久久日| 女优视频第10页| 欧美性爱1080p| 97超碰人人模人人拍人人| 九九免费影片| 中文字幕版| 色五月婷婷五月天| 亚洲 欧美日韩 另类| 国产精品视频自拍在线| 91综合网| 91欧美网| 中文字幕精品三级久久久| 99re69| 禁止观看美女黄| 色五月婷婷色| 国产男人又猛又粗又爽| 国产精品麻豆免费视频| 激情小说亚洲色图| 婷婷五月天色网| 日韩人妻丝袜美腿中文| 狠狠操一区二区| 蜜桃久久综合视频| 激情五月婷| 久久亚洲精品成人av| 翔田千里一区二区三区奶水| av毛片aaaaa免费看| 小电影欧美91| 日日躁狠狠躁天天躁精品| 欧美午夜视频| 美骚妇av高清在线| 极品内射| 亚洲人妻熟妇三十三区| 啊啊啊用力在线观看| 久久99热这里只频精品6学生| 无码 有码 国产18p| 日本免费专区| 国产区91柔拿会所技师| 色天使亚洲综合在线观看| 老外又粗又长一晚做五次| 成人毛片免费| 蜜乳中文字幕a在线| 青春草莓视频在线观看网址| 97免费在线视频| 亚洲超碰97| 亚洲天堂精品日韩电影| 国产呦精品系列在线观看| 99无码| 人妻天天爽天天爽三区| 日本韩国国产精品一区| 亚洲国产成人7777| 日韩人妻一二三区视频| jizzjizz欧美| 国产亚洲禁久一区二区| 丁香五月激情婷婷| 中亚精品极乱| 欧美中文字幕一区| 久草男人天堂| www久久精品| 快灬快灬 一下爽蜜桃在线观看| 大香蕉狠狠爱| 成人五月天丁香激情综合| 五月丁香六月综合缴清无码| 91精品久久久久五月天精品| 免费观看的黄色的网站| 中文字幕jul-617人妻熟女| 婷婷综合五月| 熟女在线视频| 亚洲综合贴图91| 超碰97综合网| 国产区日韩区在线观看| 天天操天天干一区二区 | 国产CHASE男男GAYGA 毛多色婷婷| 色综合色欲色综合色综合色综合| 插入综合网| 色综和网| 久久9精品| 久艾草在线精品视频在线观看| 乳欲人妻办公室奶水| 丁香啪啪| 国产精品网站免费| 亚洲图片视频小说| 思思热在线视频在线| 看日韩操逼| 日韩伦理视频| 色天天野狼综合社区| a级免费在线观看| 亚洲精品中文字幕一区在线视频| 亚洲美乱| 亚洲91射| 影音先锋乱伦资源| 一区二区日韩欧美久久| 青青伊人加勒比海| 丁香婷婷五月| 丁香五月激情婷婷| 精品二999| 天天干天天操天天操夜夜操天天操| 五月丁香拍拍激情综合三级| 91在线|亚| 久久无码成人| 嗯嗯啊啊操死我| 欧美韩日精品99综合| 天天操人人操狠狠插| 日韩精品 资源| 欲色啪| 免费一级黄色录像影片| 毛片视频白嫩| 亚洲狠| 中文字幕在线观看二区三区| 丰满搜索结果 -第18页- 久久高清无码 | 四虎免费在线播放| 久久久久亚洲?V片无码V| 中文字幕 一区二区 亚洲无码| 淫纸中9区| 亚洲午夜福利在线影院| 青青操少妇| 久久精品国产亚洲5555| 伊人色综合网| 男人的天堂久久| 亚洲午夜福利视频| 18禁久极品美女久久哦哟呀!| 人妻精品免费一二三区| 欧美亚洲综合色| 嗯嗯啊啊啊好爽| 国产CHASE男男GAYGA 毛多色婷婷| 国产丰满少妇久久久精品影院| 97九色| 亚洲国产精品乱码在线观看| 97超碰超| 五月丁香久久| 97超碰欧美精品| 91一起操| 久久久久久十| 99久热| 性91| 亚洲 图片 综合91| 东京热天堂网| baisiav| 欧美日韩在线小说| 五月天丁香欧洲日韩| 97欧美日韩| 日韩丝袜人妻AV| 欧美少妇色图| 97干色天堂| 无码外流操逼视频| 亚洲男人综合网| 欧美aa一级片| 久久久91福利姬| 免费一级毛片在线视频观看| 黑白配性爱AV成| 丁香五月电影| 97精品视频| 综合网久久| 国产性爱在线视频一区二区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 久久国产精品91| 日韩免费在线观看不卡| 日韩精品99久久久久久中文字幕 | 九九九九久久久| 亚洲熟女乱色| 亚洲日本激情| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 9精品久久久久| 欧美不卡在线美女| 九月丁香婷婷色| 抽插亚洲无码| 欧美中文字幕一区| 国产精品免费美女视频| 日韩精品人妻一区二区| 亚洲精品天天影视综合网 | 噜噜噜无码AV一级一级久久影院| 天天综合网~91| 超碰99热中文字幕| 亚洲av乱伦色图网站| 91东北熟女| 老熟女中文字幕高清| 五月丁香啪啪| 人人看人人爰人人操| 欧美激情 亚洲色图| 中文字幕少妇色 | 色妺妺AⅤ| 日韩操呦呦影院在线观看| 亚洲成人综合在线| 91香蕉视频在线观看免费| 九九九九热只有精品| 日韩情色AV| 五月丁香久久| 深夜国产一区二区三区在线看| 天天久久| 人妻天天爽夜夜爽2| 成人无码专区精品视频| 亚洲经典啪啪| 在线播放一级无码视频| 男人的天堂2018| 亚洲欧美91√| 天天天天天天天天综合| 欧美久久九九| 制服乱伦| 美國A片| 国产一区二区免费福利片| 熟女91网站| 国产精品电| 久日91在线| 大香蕉十区| 亚洲综合97中文网| 日本污ww视频网站| 国产操操日韩三级黄| 欧美人人操人人插| 久久中出| 欧亚日韩中文在线| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 中出789在线视频| 91久青| 天美精品av| 超碰碰碰碰| 欧美一区二区三区日韩| 91人妻做a观看视频| 精品国产91内射久久| 久久久久97| 大奶的诱惑| 欧美在线电影| 国产午夜福利合集| 国产欧美日韩女同性恋ww喷水精品| 亚洲系列第一页| 最新三级网址| 日韩性爱人人爱人人操| 国产在线综合网| 成人精品在线免费视频| 黄色工厂这里只有精品| 欧美高清91| 亚洲黄色电影| 熟妇女伦乱视频视频| 国产熟女高潮一区二区三区| 91男同| www.男人天堂| 久久超碰av在线| 9997se| 天堂综合| 91丝袜人妻| 狠狠入| 欧美色91| 欧美夜夜| 国产农村妇女精品| av毛片aaaaa免费看| 日本性感人妻91| 乱伦日本中文自拍| 7777奇米影视久久| 无码丰满熟妇一区二区浪潮AV| 亚洲A曰本VA欧美VA视频| 国产美女销魂在线观看不卡| 久久东京热成人| 亚洲97资源| 91高潮| 91天天综合日韩欧美| 97综合久久| 国产成人自拍视频视频| 人人操人人操人人人操| 精品一啪| 精品国产一区二区三区av在线资源| 久久婷婷五月综合| 九九久久久久久爱| 亚洲精品1区| 老熟女天天操| 日本孕妇一区二区视频操逼免费看 | 久久亚州精品成人Av无| 极品美女福利在线观看| 天天做天天爽| 神马午夜久久久| 91老熟女91老女人| 亚洲有码视频二区| 999久久久免费精品国产牛牛| 亚洲,日韩,欧美,成人播放| 色噜噜人妻丝袜a∨先锋影| 亚洲AV成人无码一区二区三区在线观看| 久久女人一区二区三区| 国产女同性恋视频| 一区二区亚州激情久婷婷欧美| 久久精品无码专区| 日韩有码 一区二区三区| 尤物视频一区| 欧美婷婷| 国产极品久久久| 久久人妻少妇| 精品免费视频国产一区| 一,爱啪啪,在线免费视频| 91精品大奶人妻| 久久免费看高潮毛片韩国| 99精品综合久久久久五月天| 精品一区二区三区18| 色操逼网| www.狠狠干.coom | 可以免费观看的av| 久久久久久久久久黄色网| 这里都是精品| PMv在线观看| 婷婷大香蕉| 日本顶级天天操狠狠操夜夜操中文字幕| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 精品无码产区一区二| 69XX一中文字幕人妻91| 欧美色偷拍 | 国产高清不卡视频| 日韩av在线精品观看| 啊啊啊好湿久久| 日韩在线性爱免费视频| 亚洲欧美日韩夜夜| 日本不卡中文| 国产免费永久精品无码| 一区二区国产视频在线观看| 操逼日韩无码| 牛牛操视频逼| 99啪啪视频| 久久综合九色综合欧洲98| 热天堂一区二区| 九九热只有精品| 日韩性爱电影一区| 亚洲网自拍| 亚洲色色探花| 欧美熟妇精品黑人巨大一二三区| 97爱综合| 综合网欧美在线| 国产日本顶级一区二区三区| 色丁香五月婷婷| 欧美色交| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 97在线精品| 亭亭在线资源| 精品超碰国产| 成人青青草原伊人| 婷婷午夜| 久久久少妇| 欧美色综合图片| 日韩人妻 中文字幕| 久久成人东京热人妻| 日日夜夜天天| 久久精品国产亚洲5555| 色网综合网| 欧美日韩国产色图在线| 天天综合欧美| 亚洲激情色片 | 99啪啪视频| 亚洲第一黄色av网站| 九九人妻| 高清不卡一二三区视频......| 亚洲欧美自拍偷拍| 超碰人人干天天射| 东京热熟女亚洲视频网站| 国产成人无码久久精品| 中文字幕精品免费一区二区| 色在线69堂| 美女露胸露屁股| 国产女性无套 免费观看| 久久精品国产Aⅴ| 久久黄黄黄| 久草精品视频| 嗯嗯嗯好爽| 深夜国产一区二区三区在线看| 曰韩中文人妻视频| 亚洲精品国产熟女久久久| 97视频在线免费看| 欧美日韩性爱操大逼| 最新国内自拍av免费| 懂色Av| 欧美色人| 激情小说亚洲色图| 日韩色香| 99国产女人| 色综合大香蕉| 91在线观看,天天综合| 欧美综合亚洲| 91男人综合| 91美女视频直播| 熟女露脸激情自拍视频| 欧美亚洲清纯| 欧美第一页| 91亚洲网站| 91美女视频。| 天天看精品动漫视频一区| 中文字幕一区二区三区50路| 青娱乐淫乱1314| 免费无码国产精品v片在线观看| 亚洲无码国产精品久久| 黄片www.| 亚洲天天艹| 欧美 日韩 另类 亚洲| 国产精品3| 亚洲色图欧洲| a一区二区三区乱码在线| 免费A V在线播放| 国产综合操逼高清| 超碰碰97| 中日韩免费看男女操逼大全| 亚洲国产激情国产av| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 久久少妇人妻| 蜜臀久久99精品久久久久久婷婷| 日韩精品一区二区日韩| 91久久久久久久久18| 日韩紧密久久| 欧美最大综合网| 乱伦a片视频| 超碰91在线| 欧美青青草视频| 亚洲图片另类| 天天添天天干电影| 欧美天堂超碰97| 亚欧性爱无码| 亚洲熟妇图片| 一区中文字幕二区日韩| 骚妻少妇精品性色无码四色A V| 91视频综合在线| 久操免费电影| 免费公开人人操| 97欧美精品综合| 久久久久白虎| 综合色99| 欧美在线干| 亚洲AV成人无码一区二区三区在线观看| 国产性感在线观看| 国产强奸乱伦无码视频| 无码精品人妻一区二区三区妖精| 嫩草 人人网精品| 青娱乐福利99| 嗯嗯啊啊啊好舒服| 一级做a爰片性色毛片久久| 校园春色综合| 韩三级a视频在线观看| 亚洲欧美日韩有码| 日韩丨制服丨中文|在线| 欧美亚洲日本视频久久久| 日韩精品人妻系列无码天堂| 国产美女裸体秘 永久无遮挡| 熟妇人妻一区二区三区| 国产91乱伦| 人妻喷水| 色色丁香| 久久久久久久免费A片国产成a人亚洲精∨品无码| www.人人cao| 成·人免费午夜在线观看| 又大又黄国产| 日韩综合成人免费视频| 久久久99999久网站| www.五月天| 97超碰人人模人人拍人人| 91 丝袜在线| 国产福利小视频高清在线观看| 懂色av中文字幕一区二区三区天美| 99在线免费视频| 国内外内射高清视频| 熟妇高潮精品一区二区三区下载| 一级黄色牲爱A级片| 99re在线| 操美女人妻| 久久男女激情视频网站| 亚洲欧美日韩偷拍色图| 操逼精品视频| 欧美精品在线观看| 色噜噜精品一区二区三| 乱性AV| …亚洲黄色厕厕女女在线播…|