
{"id":1301,"date":"2023-10-26T19:35:39","date_gmt":"2023-10-26T11:35:39","guid":{"rendered":"https:\/\/infernews.com\/?page_id=1301"},"modified":"2023-10-26T19:41:08","modified_gmt":"2023-10-26T11:41:08","slug":"%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%b0%86-hdr-%e8%a7%86%e9%a2%91%e8%bd%ac%e6%8d%a2%e6%88%90-sdr-%e8%a7%86%e9%a2%91","status":"publish","type":"page","link":"https:\/\/infernews.com\/blog\/%e5%a6%82%e4%bd%95%e6%ad%a3%e7%a1%ae%e5%b0%86-hdr-%e8%a7%86%e9%a2%91%e8%bd%ac%e6%8d%a2%e6%88%90-sdr-%e8%a7%86%e9%a2%91\/","title":{"rendered":"\u5982\u4f55\u6b63\u786e\u5c06 HDR \u89c6\u9891\u8f6c\u6362\u6210 SDR \u89c6\u9891"},"content":{"rendered":"\n<p>\u539f\u6587\uff1a<a href=\"https:\/\/juejin.cn\/post\/7239187347355172921\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/juejin.cn\/post\/7239187347355172921<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1\u3001\u4ec0\u4e48\u662f SDR \u548c HDR\uff1f<\/h2>\n\n\n\n<p><strong>SDR<\/strong>\uff08Standard Dynamic Range\uff09\u5373\u6807\u51c6\u52a8\u6001\u8303\u56f4\uff0c\u662f\u4e00\u79cd\u57fa\u4e8e\u4eae\u5ea6\u3001\u5bf9\u6bd4\u5ea6\u3001\u989c\u8272\u7279\u6027\uff0c\u4ee5\u53ca CRT \u663e\u793a\u5668\u7684\u5c40\u9650\u6027\u6765\u5c55\u793a\u89c6\u9891\u7684\u6280\u672f\u3002\u8fd9\u91cc\u8bf4\u7684<code>\u52a8\u6001\u8303\u56f4<\/code>\u4e00\u822c\u662f\u6307\u4eae\u5ea6\u8303\u56f4\uff0c\u66f4\u5927\u7684\u4eae\u5ea6\u8303\u56f4\u53ef\u4ee5\u652f\u6301\u66f4\u9ad8\u7684\u5bf9\u6bd4\u5ea6\u3002SDR \u7684\u652f\u6301\u7684\u4eae\u5ea6\u8303\u56f4\u5728 0.1nit \u5230 100nit \u4e4b\u95f4\uff0c\u4f7f\u7528 Rec.709\/sRGB \u8272\u57df\uff0c\u5e76\u4f7f\u7528 Gamma \u66f2\u7ebf\u6765\u4f5c\u4e3a\u5b83\u7684\u7535\u5149\u8f6c\u6362\u51fd\u6570\uff08Electro-Optical Transfer Function\uff0cEOTF\uff09\u3002<\/p>\n\n\n\n<p><strong>HDR<\/strong>\uff08High Dynamic Range\uff09\u5373\u9ad8\u52a8\u6001\u8303\u56f4\uff0c\u662f\u5bf9 SDR \u7684\u5347\u7ea7\uff0c\u662f\u4e00\u79cd\u63d0\u5347\u89c6\u9891\u663e\u793a\u8d28\u91cf\u7684\u6280\u672f\u3002HDR \u6539\u53d8\u4e86\u89c6\u9891\u548c\u56fe\u50cf\u7684\u4eae\u5ea6\u548c\u989c\u8272\u4fe1\u606f\u5728\u4fe1\u53f7\u4e2d\u7684\u8868\u793a\u65b9\u5f0f\uff0c\u4ece\u800c\u652f\u6301<strong>\u66f4\u5927\u7684\u4eae\u5ea6\u8303\u56f4\uff080.0005-10000nit\uff09<\/strong> \u3001<strong>\u66f4\u5bbd\u5e7f\u7684\u8272\u57df\uff08BT.2020\uff09<\/strong> \u3001<strong>\u66f4\u9ad8\u7cbe\u5ea6\u7684\u91cf\u5316\uff0810bit \u6216 12bit\uff09<\/strong> \u3002\u56e0\u6b64 HDR \u89c6\u9891\u753b\u9762\u53ef\u4ee5\u5c55\u73b0\u51fa\u66f4\u591a\u7684\u4eae\u90e8\u548c\u6697\u90e8\u7ec6\u8282\uff0c\u753b\u9762\u62e5\u6709\u4e30\u5bcc\u7684\u8272\u5f69\u548c\u751f\u52a8\u81ea\u7136\u7684\u7ec6\u8282\u8868\u73b0\uff0c\u56e0\u6b64\u753b\u9762\u66f4\u63a5\u8fd1\u4eba\u773c\u6240\u89c1\uff1bSDR \u89c6\u9891\u7684\u8272\u5f69\u9971\u548c\u5ea6\u4ee5\u53ca\u753b\u9762\u5bf9\u6bd4\u5ea6\u5219\u4e0d\u5982 HDR \u89c6\u9891\uff0c\u76f8\u6bd4 HDR \u89c6\u9891\uff0cSDR \u89c6\u9891\u7684\u753b\u9762\uff0c\u7ed9\u4eba\u4e00\u79cd\u6697\u6de1\u4e0d\u81ea\u7136\u7684\u89c2\u611f\uff0c\u540c\u65f6\u5728\u4eae\u90e8\u4ee5\u53ca\u6697\u90e8\u7ec6\u8282\u4e0a\u90fd\u6709\u5f88\u660e\u663e\u7684\u7f3a\u5931\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"375\" height=\"281\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-9.png\" alt=\"\" class=\"wp-image-1302\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-9.png 375w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-9-300x225.png 300w\" sizes=\"auto, (max-width: 375px) 100vw, 375px\" \/><\/figure>\n\n\n\n<p>HDR \u548c SDR \u7684\u89c6\u89c9\u5dee\u5f02<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-10-1024x576.png\" alt=\"\" class=\"wp-image-1303\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-10-1024x576.png 1024w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-10-300x169.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-10-768x432.png 768w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-10.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>HDR \u548c SDR \u4fe1\u606f\u5904\u7406\u533a\u522b<\/p>\n\n\n\n<p>HDR \u6280\u672f\u6709\u7740\u4e0d\u540c\u7684\u6807\u51c6\uff0c\u5176\u4e2d\u5e38\u89c1\u7684\u6709\u56db\u4e2a\uff1aHDR10\u3001HDR10+\u3001Dolby Vision\u3001HLG\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>HDR10<\/code>&nbsp;\u662f\u6bd4\u8f83\u57fa\u7840\u7684\u4e00\u4e2a\u7248\u672c\uff0c\u4e5f\u662f\u4e00\u4e2a\u5f00\u653e\u7684\u6807\u51c6\uff0c\u4e8e 2014 \u5e74\u88ab\u91c7\u7528\u3002HDR10 \u7531\u4e8e\u5176\u6613\u7528\u6027\u548c\u514d\u8bb8\u53ef\u8d39\u800c\u83b7\u5f97\u5e7f\u6cdb\u7684\u63a5\u53d7\u3002\u8be5\u6807\u51c6\u63cf\u8ff0\u4e86\u7b26\u5408 UHDTV Rec.ITU-R BT.2020 \u6807\u51c6\u5efa\u8bae\u7684\u89c6\u9891\u5185\u5bb9\u3002HDR10 \u91c7\u7528\u7684\u662f PQ EOTF \u8f6c\u6362\u66f2\u7ebf\uff0c\u4e0e SDR \u663e\u793a\u5668\u4e0d\u517c\u5bb9\u3002HDR10 \u91c7\u7528\u4e86\u9759\u6001\u5143\u6570\u636e\uff0c\u4e0d\u80fd\u6ee1\u8db3\u4e0d\u540c\u573a\u666f\u6216\u8005\u4e0d\u540c\u5e27\u8c03\u8272\u7684\u9700\u6c42\uff0c\u6240\u4ee5 HDR10 \u7684\u6548\u679c\u5c55\u73b0\u80fd\u529b\u6bd4\u8f83\u6709\u9650\u3002<\/li>\n\n\n\n<li><code>HDR10+<\/code>&nbsp;\u662f\u4e09\u661f\u63d0\u51fa\u7684\u7528\u4e8e\u5bf9\u6297 Dolby Vision \u7684\u6280\u672f\uff0c\u5728 HDR10 \u7684\u57fa\u7840\u4e0a\uff0c\u6dfb\u52a0\u4e86\u52a8\u6001\u5143\u6570\u636e\u7684\u652f\u6301\u3002\u53ef\u4ee5\u9488\u5bf9\u6bcf\u4e00\u4e2a\u89c6\u9891\u573a\u666f\u6216\u8005\u89c6\u9891\u5e27\u8fdb\u884c\u4eae\u5ea6\u548c\u8272\u5f69\u7684\u8c03\u8282\uff0c\u652f\u6301\u52a8\u6001\u8272\u8c03\u6620\u5c04\uff0c\u5411\u540e\u4e5f\u53ef\u517c\u5bb9 HDR10 \u7684\u683c\u5f0f\u3002<\/li>\n\n\n\n<li><code>Dolby Vision<\/code>&nbsp;\u662f\u675c\u6bd4\u516c\u53f8\u5177\u6709\u77e5\u8bc6\u4ea7\u6743\u7684\u6280\u672f\uff0c\u9700\u8981\u6388\u6743\u8d39\u7528\u624d\u80fd\u4f7f\u7528\u3002\u4e5f\u56e0\u4e3a\u9700\u8981\u6388\u6743\u8d39\u7528\uff0c\u6240\u4ee5\u5185\u5bb9\u8fd8\u4e0d\u662f\u7279\u522b\u4e30\u5bcc\u3002Dolby Vision \u5b9e\u9645\u662f\u56fd\u9645\u4e0a\u9996\u4e2a\u63a8\u51fa\u7684\u5546\u4e1a\u5316\u7248\u672c\u7684 HDR \u6807\u51c6\uff0c\u5177\u5907\u975e\u5e38\u5f3a\u7684\u7ade\u4e89\u529b\u3002\u5b83\u91c7\u7528\u52a8\u6001\u5143\u6570\u636e\uff0c\u53ef\u4ee5\u6700\u9ad8\u652f\u6301 10000nit \u7684\u5cf0\u503c\u4eae\u5ea6\u3002\u4e3a\u4e86\u589e\u5f3a\u7801\u6d41\u64ad\u653e\u548c\u663e\u793a\u517c\u5bb9\u6027\uff0c\u8bbe\u8ba1\u4e86\u4f17\u591a\u7684 Profile \u652f\u6301\u4e0d\u540c\u7684\u5e94\u7528\u3002<\/li>\n\n\n\n<li><code>HLG<\/code>&nbsp;\u6807\u51c6\u51fa\u73b0\u4e8e 2015 \u5e74\uff0c\u662f\u7531\u82f1\u56fd BBC \u516c\u53f8\u548c\u65e5\u672c\u7684 NHK \u7535\u89c6\u53f0\u5171\u540c\u5f00\u53d1\uff0c\u4e5f\u88ab\u5e7f\u6cdb\u91c7\u7528\u3002\u8be5\u6807\u51c6\u63cf\u8ff0\u4e86\u7b26\u5408 BT.2020 \u8981\u6c42\u7684\u5185\u5bb9\u3002\u5982\u524d\u6240\u8ff0\uff0cHLG \u5e7f\u6cdb\u5730\u5e94\u7528\u5230\u5e7f\u7535\u7cfb\u7edf\u4e2d\uff0c\u6709\u5f88\u597d\u7684\u517c\u5bb9\u6027\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u4e0b\u9762\u4e0d\u540c\u683c\u5f0f HDR \u7684\u53c2\u6570\u5bf9\u6bd4\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"866\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-11-1024x866.png\" alt=\"\" class=\"wp-image-1304\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-11-1024x866.png 1024w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-11-300x254.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-11-768x649.png 768w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-11.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u4e0d\u540c\u683c\u5f0f HDR \u7684\u53c2\u6570\u5bf9\u6bd4<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e0a\u9762\u7684\u4ecb\u7ecd\u4e2d\uff0c\u63d0\u5230\u4e86<code>\u5143\u6570\u636e<\/code>\uff0c\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u4e00\u4e0b\uff1a<\/p>\n\n\n\n<p>HDR \u7684\u5143\u6570\u636e\u662f\u7528\u6765\u63cf\u8ff0\u89c6\u9891\u6216\u56fe\u50cf\u5904\u7406\u8fc7\u7a0b\u4e2d\u7684\u5173\u952e\u4fe1\u606f\u6216\u8005\u7279\u5f81\uff0c\u4e3b\u8981\u6709\u4e24\u79cd\uff1a<code>\u9759\u6001\u5143\u6570\u636e<\/code>\u548c<code>\u52a8\u6001\u5143\u6570\u636e<\/code>\u3002<\/p>\n\n\n\n<p>\u9759\u6001\u5143\u6570\u636e\u89c4\u5b9a\u4e86\u6574\u4e2a\u7247\u5b50\u50cf\u7d20\u7ea7\u522b\u6700\u5927\u4eae\u5ea6\u4e0a\u9650\uff0c\u5728 ST 2086 \u4e2d\u6709\u6807\u51c6\u5316\u7684\u5b9a\u4e49\u3002\u9759\u6001\u5143\u6570\u636e\u7684\u7f3a\u70b9\u662f\u5fc5\u987b\u505a\u5168\u5c40\u7684\u8272\u8c03\u6620\u5c04\uff0c\u6ca1\u6709\u8db3\u591f\u7684\u8c03\u8282\u7a7a\u95f4\uff0c\u517c\u5bb9\u6027\u4e0d\u597d\u3002<\/p>\n\n\n\n<p>\u52a8\u6001\u5143\u6570\u636e\u53ef\u4ee5\u5f88\u597d\u5730\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u52a8\u6001\u5143\u6570\u636e\u4e3b\u8981\u6709\u4e24\u4e2a\u65b9\u9762\u7684\u4f5c\u7528\uff1a\u4e0e\u9759\u6001\u5143\u6570\u636e\u76f8\u6bd4\uff0c\u5b83\u53ef\u4ee5\u5728\u6bcf\u4e00\u4e2a\u573a\u666f\u6216\u8005\u6bcf\u4e00\u5e27\u753b\u9762\uff0c\u7ed9\u8c03\u8272\u5e08\u4e00\u4e2a\u53d1\u6325\u7684\u7a7a\u95f4\uff0c\u4ee5\u5c55\u73b0\u66f4\u4e30\u5bcc\u7684\u7ec6\u8282\uff1b\u53e6\u4e00\u4e2a\u65b9\u9762\uff0c\u901a\u8fc7\u52a8\u6001\u5143\u6570\u636e\uff0c\u5728\u76ee\u6807\u663e\u793a\u4eae\u5ea6\u4e0a\u505a\u8272\u8c03\u6620\u5c04\uff0c\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u5728\u76ee\u6807\u663e\u793a\u5668\u4e0a\u5448\u73b0\u4f5c\u8005\u7684\u521b\u4f5c\u610f\u56fe\u3002<\/p>\n\n\n\n<p>SMPTE ST 2094 \u6807\u51c6\u4e2d\u5b9a\u4e49\u4e86\u4e00\u7cfb\u5217\u7684\u52a8\u6001\u5143\u6570\u636e\u3002ST 2094-10\u3001ST 2094-20\u3001ST 2094-30\u3001ST 2094-40 \u5206\u522b\u7ed9\u51fa\u4e86\u675c\u6bd4\u3001\u98de\u5229\u6d66\u3001\u7279\u827a\u548c\u4e09\u661f\u56db\u5bb6\u516c\u53f8\u7684\u52a8\u6001\u5143\u6570\u636e\u548c\u8272\u57df\u8f6c\u6362\u7684\u65b9\u6848\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u53c2\u8003\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Standard-dynamic-range[1]<\/li>\n\n\n\n<li>High-dynamic-range[2]<\/li>\n\n\n\n<li>HDR \u6280\u672f\u8d8b\u52bf\u6d45\u6790[3]<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2\u3001HDR \u5728\u5e94\u7528\u4e2d\u53ef\u80fd\u9047\u5230\u4ec0\u4e48\u95ee\u9898\uff1f<\/h2>\n\n\n\n<p>\u56e0\u4e3a HDR \u662f\u4e00\u5957\u6d89\u53ca\u5230\u989c\u8272\u7a7a\u95f4\u548c\u8bbe\u5907\u663e\u793a\u7279\u6027\u7684\u6280\u672f\u65b9\u6848\uff0c\u6240\u4ee5\u8981\u5b9e\u73b0\u5bf9 HDR \u7684\u652f\u6301\uff0c\u9700\u8981\u6ee1\u8db3\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u89c6\u9891\u8d44\u6e90\u6ee1\u8db3 HDR \u6807\u51c6<\/li>\n\n\n\n<li>\u663e\u793a\u8bbe\u5907\u652f\u6301 HDR \u663e\u793a<\/li>\n<\/ul>\n\n\n\n<p>\u7531\u4e8e HDR \u6280\u672f\u65b9\u6848\u6d89\u53ca\u5230\u989c\u8272\u7a7a\u95f4\uff0c\u4f7f\u5f97\u5728\u76f8\u673a\u91c7\u96c6\u3001\u7f16\u7801\u3001\u89e3\u7801\u3001\u6e32\u67d3\u5230\u5c4f\u5e55\u4e0a\u8fd9\u4e00\u6574\u4e2a\u6d41\u7a0b\u91cc\u9762\uff0c\u51e1\u662f\u6d89\u53ca\u5230\u8981\u5bf9\u989c\u8272\u4fe1\u606f\u8fdb\u884c\u7406\u89e3\u548c\u5904\u7406\u7684\u8282\u70b9\uff0c\u90fd\u9700\u8981\u5b9e\u73b0\u5bf9 HDR \u7684\u652f\u6301\u624d\u80fd\u4fdd\u8bc1\u6700\u7ec8\u6b63\u786e\u5730\u5448\u73b0\u51fa\u5b83\u7684\u7279\u6027\u3002\u8fd9\u5c31\u5f88\u5bb9\u6613\u51fa\u73b0\u7531\u4e8e\u67d0\u4e00\u4e2a\u73af\u8282\u7f3a\u5931\u5bf9 HDR \u7684\u652f\u6301\u800c\u9020\u6210\u6700\u7ec8\u7684\u5448\u73b0\u95ee\u9898\u3002<\/p>\n\n\n\n<p>\u6240\u4ee5\uff0c\u4f5c\u4e3a\u4e00\u79cd\u65b0\u7684\u6280\u672f\u6807\u51c6\uff0cHDR \u5728\u5e94\u7528\u4e2d\u6700\u5927\u7684\u95ee\u9898\u662f<strong>\u517c\u5bb9\u6027\u95ee\u9898<\/strong>\uff0c\u8fd9\u91cc\u6700\u5927\u7684\u517c\u5bb9\u6027\u95ee\u9898\u662f HDR \u4e0e SDR \u65b0\u65e7\u6280\u672f\u4e4b\u95f4\u7684\u517c\u5bb9\uff0c\u6b64\u5916\u8fd8\u6709\u4e0d\u540c HDR \u6807\u51c6\u4e4b\u95f4\u7684\u517c\u5bb9\u3002<\/p>\n\n\n\n<p>HDR \u5728\u5e94\u7528\u4e2d\u6700\u5e38\u89c1\u7684\u95ee\u9898\u6709\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u89c6\u9891\u64ad\u653e\u9ed1\u5c4f\u3002<\/strong><\/li>\n\n\n\n<li><strong>\u89c6\u9891\u64ad\u653e\u8272\u5f69\u5f02\u5e38\u3002<\/strong><\/li>\n\n\n\n<li><strong>\u89c6\u9891\u753b\u9762\u8f83\u6697\u3002<\/strong><\/li>\n\n\n\n<li><strong>\u89c6\u9891\u753b\u9762\u53d1\u7070\u3002<\/strong><\/li>\n<\/ul>\n\n\n\n<p><strong>\u8fd9\u79cd\u517c\u5bb9\u6027\u95ee\u9898\u662f\u600e\u4e48\u9020\u6210\u7684\u5462\uff1f<\/strong><\/p>\n\n\n\n<p><strong>1\uff09\u989c\u8272\u4f4d\u6df1<\/strong><\/p>\n\n\n\n<p>\u6838\u5fc3\u539f\u56e0\u4e4b\u4e00\u662f\u989c\u8272\u4f4d\u6df1\u7684\u5dee\u522b\u3002SDR \u4f7f\u7528\u7684\u989c\u8272\u7a7a\u95f4\u662f\u4f7f\u7528 8bit \u7684\u4f4d\u6df1\uff0c\u800c HDR \u5219\u4f7f\u7528\u7684\u989c\u8272\u7a7a\u95f4\u662f\u4f7f\u7528 10bit \u6216 12bit \u7684\u4f4d\u6df1\u3002\u8fd9\u6837\u4e00\u6765\u5728\u8868\u793a\u4fe1\u606f\u65f6\u5c31\u6709\u5bb9\u91cf\u5dee\u5f02\u4e86\u3002\u5728\u89c6\u9891\u5904\u7406\u7684\u6d41\u7a0b\u4e2d\uff0c\u5982\u679c\u4ece HDR \u5411 SDR \u8f6c\u6362\u65f6\uff0c\u5982\u679c\u5904\u7406\u4e0d\u5408\u7406\u5c31\u4f1a\u51fa\u73b0\u7834\u574f\u6027\u7684\u4fe1\u606f\u4e22\u5931\uff0c\u5bfc\u81f4\u6700\u7ec8\u89c6\u9891\u5c55\u793a\u6548\u679c\u7684\u5f02\u5e38\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"411\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-12.png\" alt=\"\" class=\"wp-image-1305\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-12.png 960w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-12-300x128.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-12-768x329.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/figure>\n\n\n\n<p>8bit vs. 10bit<\/p>\n\n\n\n<p><strong>2\uff09\u8272\u57df<\/strong><\/p>\n\n\n\n<p>\u6838\u5fc3\u539f\u56e0\u4e4b\u4e8c\u662f\u8272\u57df\u7684\u5dee\u522b\u3002\u8272\u57df\u662f\u6307\u4e00\u4e2a\u989c\u8272\u7a7a\u95f4\u6240\u80fd\u8868\u793a\u7684\u6240\u6709\u989c\u8272\u7684\u96c6\u5408\uff0c\u8272\u57df\u8d8a\u5e7f\uff0c\u6240\u80fd\u8868\u793a\u7684\u8272\u5f69\u8d8a\u4e30\u5bcc\u3002<\/p>\n\n\n\n<p>SDR \u4f7f\u7528 BT.709 \u989c\u8272\u7a7a\u95f4\u6807\u7684\u8272\u57df\uff0c\u800c HDR \u5219\u4f7f\u7528 BT.2020 \u989c\u8272\u7a7a\u95f4\u7684\u66f4\u5e7f\u7684\u8272\u57df\u3002\u5bbd\u8272\u57df\u5411\u7a84\u8272\u57df\u517c\u5bb9\u65f6\uff0c\u540c\u6837\u4e5f\u6709\u4fe1\u606f\u4e22\u5931\u7684\u95ee\u9898\uff0c\u4e0d\u5408\u7406\u7684\u5904\u7406\u4e5f\u4f1a\u5bfc\u81f4\u6700\u7ec8\u89c6\u9891\u5c55\u793a\u6548\u679c\u7684\u5f02\u5e38\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"589\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-13-1024x589.png\" alt=\"\" class=\"wp-image-1306\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-13-1024x589.png 1024w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-13-300x173.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-13-768x442.png 768w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-13.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>BT.709 vs. BT.2020<\/p>\n\n\n\n<p><strong>3\uff09\u8f6c\u6362\u51fd\u6570\uff08Transfer Function\uff09<\/strong><\/p>\n\n\n\n<p>\u53e6\u5916\u4e00\u4e2a\u5e26\u6765\u517c\u5bb9\u6027\u95ee\u9898\u7684\u539f\u56e0\u662f\u8f6c\u6362\u51fd\u6570\u7684\u5dee\u522b\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u7684\u8f6c\u6362\u51fd\u6570\u662f\u6307\u5149\u7535\u8f6c\u6362\u51fd\u6570\uff08Optical-Electro Transfer Function\uff09\u6216\u7535\u5149\u8f6c\u6362\u51fd\u6570\uff08Electro-Optical Transfer Function\uff09\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u4e3a\u4ec0\u4e48\u8981\u4f7f\u7528\u8f6c\u6362\u51fd\u6570\u5462\uff1f\u4eba\u773c\u5bf9\u4e8e\u7269\u7406\u4e16\u754c\u7684\u611f\u77e5\u662f\u975e\u7ebf\u6027\u7684\uff0c\u5bf9\u4e8e\u4e2d\u7b49\u4eae\u5ea6\u548c\u6697\u90e8\u533a\u95f4\u7684\u654f\u611f\u7a0b\u5ea6\u8fdc\u9ad8\u4e8e\u9ad8\u4eae\u5ea6\u533a\u95f4\u3002\u4e3a\u4e86\u8ba8\u597d\u4eba\u773c\u8fd9\u79cd\u5bf9\u4e0d\u540c\u4eae\u5ea6\u7684\u975e\u7ebf\u6027\u7684\u654f\u611f\u5ea6\uff0c\u6211\u4eec\u5728\u8bbe\u5907\u7684\u91c7\u96c6\u7535\u8def\u4e2d\u91c7\u96c6\u5230\u5149\u4fe1\u53f7\u5411\u7535\u4fe1\u53f7\u8f6c\u6362\u65f6\uff0c\u901a\u5e38\u4f1a\u5c06\u5176\u8f6c\u6362\u4e3a\u975e\u7ebf\u6027\u4fe1\u53f7\uff0c\u8fd9\u91cc\u7528\u5230\u4e86 OETF\uff0c\u8fd9\u6837\u5bf9\u975e\u7ebf\u6027\u4fe1\u53f7\u8fdb\u884c\u7f16\u7801\u65f6\uff0c\u53ef\u4ee5\u7528\u66f4\u591a\u7684\u7801\u7387\u6765\u7f16\u7801\u4eba\u773c\u654f\u611f\u7684\u4e2d\u7b49\u4eae\u5ea6\u6216\u6697\u90e8\u7ec6\u8282\uff0c\u4ece\u800c\u4f7f\u5f97\u7f16\u7801\u5728\u8ba8\u597d\u4eba\u773c\u4e0a\u6709\u66f4\u597d\u7684 ROI\u3002\u800c\u5728\u663e\u793a\u65f6\uff0c\u6211\u4eec\u8981\u518d\u5c06\u975e\u7ebf\u6027\u4fe1\u53f7\u8fd8\u539f\u4e3a\u7ebf\u6027\u5149\u5c55\u793a\u7ed9\u4eba\u773c\uff0c\u8fd9\u65f6\u5019\u5219\u8981\u7528\u5230 EOTF\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"418\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-14.png\" alt=\"\" class=\"wp-image-1307\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-14.png 640w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-14-300x196.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>SDR \u548c HDR \u7684\u975e\u7ebf\u6027\u7f16\u7801<\/p>\n\n\n\n<p>\u4f20\u7edf\u7684 SDR \u4f7f\u7528 BT.709 Gamma \u66f2\u7ebf\u4f5c\u4e3a\u8f6c\u6362\u51fd\u6570\uff0c\u5bf9\u9ad8\u4eae\u90e8\u5206\u8fdb\u884c\u4e86\u622a\u65ad\uff0c\u53ef\u4ee5\u8868\u8fbe\u7684\u4eae\u5ea6\u52a8\u6001\u8303\u56f4\u6709\u9650\uff0c\u6700\u5927\u4eae\u5ea6\u53ea\u6709 100nit\u3002\u800c\u5728 HDR \u6280\u672f\u4e2d\uff0c\u589e\u52a0\u4e86\u9ad8\u4eae\u90e8\u5206\u7ec6\u8282\u7684\u8868\u8fbe\uff0c\u5927\u5927\u6269\u5c55\u4e86\u4eae\u5ea6\u7684\u52a8\u6001\u8303\u56f4\uff0cGamma \u66f2\u7ebf\u5df2\u7ecf\u4e0d\u80fd\u6ee1\u8db3\u6700\u5927\u4eae\u5ea6\u7684\u9700\u6c42\uff0cHDR \u5219\u4f7f\u7528 PQ\uff08Perceptual Quantizer\uff0c\u611f\u77e5\u91cf\u5316\uff09\u6216 HLG\uff08Hybrid Log Gamma\uff0c\u6df7\u5408\u5bf9\u6570\u4f3d\u9a6c\uff09\u66f2\u7ebf\u4f5c\u4e3a\u8f6c\u6362\u51fd\u6570\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"414\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-15-1024x414.png\" alt=\"\" class=\"wp-image-1308\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-15-1024x414.png 1024w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-15-300x121.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-15-768x311.png 768w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-15.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>SDR \u548c HDR \u7684\u8f6c\u6362\u51fd\u6570<\/p>\n\n\n\n<p>\u4e0d\u540c HDR \u8f6c\u6362\u51fd\u6570\u7684\u8bbe\u8ba1\u521d\u8877\u4e0d\u540c\uff0c\u4e0b\u9762\u662f PQ \u548c HLG \u7684\u533a\u522b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>PQ\uff08Perceptual Quantizer\uff0c\u611f\u77e5\u91cf\u5316\uff09\u66f2\u7ebf<\/code>\u7684\u8bbe\u8ba1\u66f4\u63a5\u8fd1\u4eba\u773c\u7684\u7279\u70b9\uff0c\u4eae\u5ea6\u8868\u8fbe\u66f4\u51c6\u786e\u3002\u57fa\u4e8e\u4eba\u773c\u7684\u5bf9\u6bd4\u654f\u611f\u5ea6\u51fd\u6570\uff08Contrast Sensitivity Function\uff0cCSF\uff09\uff0c\u5728 SMPTE ST 2084 \u6807\u51c6\u4e2d\u89c4\u5b9a\u4e86 EOTF \u66f2\u7ebf\u3002\u4eae\u5ea6\u8303\u56f4\u53ef\u4ece\u6700\u6697 0.00005nit \u5230\u6700\u4eae 10000nit\u3002PQ \u66f2\u7ebf\u6700\u65e9\u662f\u7531 Dolby \u516c\u53f8\u5f00\u53d1\u7684\uff0c\u5e76\u4e14\u5728 ST 2084 \u4e2d\u8fdb\u884c\u4e86\u6807\u51c6\u5316\u3002<\/li>\n\n\n\n<li><code>HLG\uff08Hybrid Log Gamma\uff0c\u6df7\u5408\u5bf9\u6570\u4f3d\u9a6c\uff09\u66f2\u7ebf<\/code>\u662f\u53e6\u5916\u4e00\u4e2a\u91cd\u8981\u7684 HDR \u8f6c\u6362\u51fd\u6570\u66f2\u7ebf\uff0c\u7531 BBC \u548c NHK \u516c\u53f8\u5f00\u53d1\u3002\u8fd9\u4e2a\u66f2\u7ebf\u4e0e PQ \u66f2\u7ebf\u4e0d\u540c\uff0cHLG \u89c4\u5b9a\u7684\u662f OETF \u66f2\u7ebf\uff0c\u56e0\u4e3a\u5728\u4f4e\u4eae\u5ea6\u533a\u57df\u57fa\u672c\u4e0e Gamma \u66f2\u7ebf\u91cd\u5408\uff0c\u6240\u4ee5\u63d0\u4f9b\u4e86\u4e0e SDR \u663e\u793a\u8bbe\u5907\u5f88\u597d\u7684\u517c\u5bb9\u6027\uff0c\u5728\u5e7f\u64ad\u7535\u89c6\u7cfb\u7edf\u91cc\u6709\u7740\u5e7f\u6cdb\u7684\u5e94\u7528\u3002HLG \u66f2\u7ebf\u6700\u65e9\u5728 ARIB STD-B67 \u4e2d\u8fdb\u884c\u4e86\u6807\u51c6\u5316\uff0c\u540e\u9762\u4e5f\u8fdb\u5165\u4e86 ITU-R BT.2100\u3002<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"746\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-16.png\" alt=\"\" class=\"wp-image-1309\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-16.png 768w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-16-300x291.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p>OETF \u548c EOTF<\/p>\n\n\n\n<p>\u5982\u679c\u4f7f\u7528\u7684\u8f6c\u6362\u51fd\u6570\u4e0d\u5339\u914d\uff0c\u5c31\u4f1a\u51fa\u73b0\u4fe1\u606f\u9519\u8bef\u800c\u5f71\u54cd\u6700\u7ec8\u7684\u89c6\u9891\u5c55\u793a\u6548\u679c\u3002<\/p>\n\n\n\n<p><strong>4\uff09\u8bbe\u5907\u663e\u793a\u4eae\u5ea6<\/strong><\/p>\n\n\n\n<p>\u5176\u4ed6\u7684\u539f\u56e0\u8fd8\u6709\u8bbe\u5907\u663e\u793a\u4eae\u5ea6\u652f\u6301\u7684\u95ee\u9898\u3002HDR \u7684\u4f7f\u7528\u4e5f\u9700\u8981\u786c\u4ef6\u8bbe\u5907\u7684\u652f\u6301\uff0c\u7535\u8111\u6216\u624b\u673a\u7684\u5c4f\u5e55\u662f\u5426\u80fd\u652f\u6301\u66f4\u9ad8\u7684\u4eae\u5ea6\u548c\u5bf9\u6bd4\u5ea6\u4e5f\u4f1a\u5f71\u54cd\u6700\u7ec8\u5448\u73b0\u89c6\u9891\u7684\u6548\u679c\u3002<\/p>\n\n\n\n<p>\u4e0b\u56fe\u662f\u4eba\u773c\u80fd\u611f\u53d7\u7684\u4eae\u5ea6\u8303\u56f4\uff0c\u4ee5\u53ca SDR \u548c HDR \u6240\u80fd\u652f\u6301\u7684\u4eae\u5ea6\u8303\u56f4\u7684\u5bf9\u6bd4\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"399\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-17.png\" alt=\"\" class=\"wp-image-1310\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-17.png 865w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-17-300x138.png 300w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-17-768x354.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><\/figure>\n\n\n\n<p>\u4eba\u773c\u3001SDR\u3001HDR \u7684\u4eae\u5ea6\u8303\u56f4<\/p>\n\n\n\n<p>\u4e00\u822c\u53f0\u5f0f\u7535\u8111\u663e\u793a\u5668\u7684\u6301\u7eed\u4eae\u5ea6\u5728 350 \u5c3c\u7279\u5de6\u53f3\uff0c\u6709\u4e9b\u4e13\u4e1a\u663e\u793a\u5668\u7684\u4f1a\u9ad8\u4e00\u70b9\uff0c\u4f46\u5927\u90e8\u5206\u6301\u7eed\u4e0d\u4e86\u8f83\u957f\u65f6\u95f4\u3002\u505a\u7684\u6bd4\u8f83\u597d\u7684\uff0c\u6bd4\u5982\u82f9\u679c\u7684 Pro Display XDR \u663e\u793a\u5668\u5219\u53ef\u4ee5\u8fbe\u5230 1000 \u5c3c\u7279\u5168\u5c4f\u6301\u7eed\u4eae\u5ea6\uff0c\u5cf0\u503c\u4eae\u5ea6\u8fbe\u5230 1600 \u5c3c\u7279\u3002<\/p>\n\n\n\n<p>\u6b64\u5916\uff0c\u7531\u4e8e HDR \u6709\u591a\u79cd\u683c\u5f0f\uff0c\u4e0d\u540c\u683c\u5f0f\u4e4b\u95f4\u7684\u53c2\u6570\u533a\u522b\u4e5f\u53ef\u80fd\u662f\u5f71\u54cd\u89c6\u9891\u6700\u7ec8\u5448\u73b0\u6548\u679c\u7684\u539f\u56e0\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u518d\u56de\u5934\u770b\u524d\u9762\u63d0\u5230\u7684 HDR \u5728\u5e94\u7528\u4e2d\u5e38\u89c1\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u77e5\u9053\u539f\u56e0\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u89c6\u9891\u64ad\u653e\u9ed1\u5c4f\u3002<\/strong> \u53ef\u80fd\u662f\u5728\u64ad\u653e HDR \u89c6\u9891\u65f6\uff0c\u89e3\u7801\u5668\u4e0d\u652f\u6301 BT.2020 \u989c\u8272\u7a7a\u95f4\uff08\u5b9a\u4e49\u4e86 10bit \u989c\u8272\u4f4d\u6df1\uff09\uff0c\u51fa\u73b0\u89e3\u7801\u9519\u8bef\u9020\u6210\u89c6\u9891\u9ed1\u5c4f\u3002<\/li>\n\n\n\n<li><strong>\u89c6\u9891\u64ad\u653e\u8272\u5f69\u5f02\u5e38\u3002<\/strong> \u53ef\u80fd\u662f\u64ad\u653e\u5668\u6e32\u67d3\u6a21\u5757\u4e0d\u652f\u6301 BT.2020 \u989c\u8272\u7a7a\u95f4\u5bfc\u81f4\u6e32\u67d3\u8272\u5f69\u5f02\u5e38\u7684\u95ee\u9898\u3002<\/li>\n\n\n\n<li><strong>\u89c6\u9891\u753b\u9762\u8f83\u6697\u3002<\/strong> \u53ef\u80fd\u662f\u663e\u793a\u5668\u4e0d\u652f\u6301 HDR \u7684\u4eae\u5ea6\u8303\u56f4\uff0c\u65e0\u6cd5\u8bc6\u522b\u89c6\u9891\u6570\u636e\u4e2d\u7684\u4eae\u5ea6\u4fe1\u606f\u5bfc\u81f4\u3002<\/li>\n\n\n\n<li><strong>\u89c6\u9891\u753b\u9762\u53d1\u7070\u3002<\/strong> \u53ef\u80fd\u662f\u663e\u793a\u5668\u4e0d\u652f\u6301 HDR \u989c\u8272\u7a7a\u95f4 BT.2020 \u7684\u5bbd\u8272\u57df\uff0c\u5bfc\u81f4\u663e\u793a\u5668\u4e0a\u7684\u8272\u5f69\u9971\u548c\u5ea6\u4e0d\u8db3\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u53c2\u8003\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU1NTEzOTM5Mw%3D%3D%26mid%3D2247521774%26idx%3D1%26sn%3Dd2b1a7a705e742c65697760f7641ec9b%26scene%3D21%23wechat_redirect\" target=\"_blank\" rel=\"noreferrer noopener\">HDR \u6280\u672f\u8d8b\u52bf\u6d45\u6790<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU1NTEzOTM5Mw%3D%3D%26mid%3D2247520083%26idx%3D1%26sn%3Dbc1768947ce8671a43a912b2a6917c3b%26scene%3D21%23wechat_redirect\" target=\"_blank\" rel=\"noreferrer noopener\">\u5fae\u535a HDR \u89c6\u9891\u7684\u843d\u5730\u5b9e\u8df5<\/a><\/li>\n\n\n\n<li>\u9ad8\u52a8\u6001\u8303\u56f4\u7535\u89c6\u7684\u7406\u8bba\u539f\u7406<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3\u3001\u5982\u4f55\u6b63\u786e\u5c06 HDR \u89c6\u9891\u8f6c\u6362\u6210 SDR \u89c6\u9891\uff1f<\/h2>\n\n\n\n<p>\u8981\u89e3\u51b3 HDR \u5728\u5e94\u7528\u4e2d\u7684\u95ee\u9898\uff0c\u6700\u597d\u7684\u4f53\u9a8c\u5f53\u7136\u662f\u5168\u94fe\u8def\u652f\u6301 HDR \u6280\u672f\u6807\u51c6\u6765\u5448\u73b0\u6700\u4f73\u7684\u89c6\u9891\u56fe\u50cf\u89c6\u89c9\u3002\u4f46\u73b0\u5b9e\u662f\uff0c\u6211\u4eec\u8fd8\u662f\u6709\u5f88\u591a\u73b0\u5b58\u7684\u663e\u793a\u8bbe\u5907\u662f\u4e0d\u652f\u6301 HDR \u7684\uff0c\u5bf9\u4e8e\u8fd9\u79cd\u60c5\u51b5\uff0c\u6211\u4eec\u5219\u9700\u8981\u5728\u8fd9\u4e9b\u8bbe\u5907\u4e0a\u5c06 HDR \u89c6\u9891\u8f6c\u6362\u6210 SDR \u89c6\u9891\uff0c\u5e76\u4fdd\u8bc1\u8f6c\u6362\u8fc7\u7a0b\u5bf9\u4fe1\u606f\u7684\u5408\u7406\u5904\u7406\u4ece\u800c\u5c3d\u91cf\u964d\u4f4e\u89c6\u9891\u89c6\u89c9\u4f53\u9a8c\u7684\u635f\u5931\u3002\u8fd9\u5c31\u662f\u6211\u4eec\u63a5\u4e0b\u6765\u8981\u8bb2\u7684\uff1a<strong>\u5982\u4f55\u6b63\u786e\u5c06 HDR \u89c6\u9891\u8f6c\u6362\u6210 SDR \u89c6\u9891\uff1f<\/strong><\/p>\n\n\n\n<p>\u7b80\u5355\u6765\u8bb2\uff0cHDR \u89c6\u9891\u8f6c SDR \u89c6\u9891\u9700\u8981\u4e0b\u9762\u51e0\u6b65\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1\u3001HDR \u975e\u7ebf\u6027\u7535\u4fe1\u53f7\u8f6c\u4e3a HDR \u7ebf\u6027\u5149\u4fe1\u53f7\uff08EOTF\uff09<\/li>\n\n\n\n<li>2\u3001HDR \u7ebf\u6027\u5149\u4fe1\u53f7\u505a\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\uff08Color Space Converting\uff09\uff0c\u901a\u5e38\u662f\u4ece BT.2020 \u8f6c\u6362\u5230 BT.709<\/li>\n\n\n\n<li>3\u3001HDR \u7ebf\u6027\u5149\u4fe1\u53f7\u8272\u8c03\u6620\u5c04\u4e3a SDR \u7ebf\u6027\u5149\u4fe1\u53f7\uff08Tone Mapping\uff09<\/li>\n\n\n\n<li>4\u3001SDR \u7ebf\u6027\u5149\u4fe1\u53f7\u8f6c SDR \u975e\u7ebf\u6027\u7535\u4fe1\u53f7\uff08OETF\uff09<\/li>\n<\/ul>\n\n\n\n<p>HDR \u5230 SDR \u89c6\u9891\u7684\u8f6c\u6362\uff0c\u7ecf\u5386\u4e86\u4eae\u5ea6\u52a8\u6001\u8303\u56f4\u548c\u8272\u5f69\u7a7a\u95f4\u7684\u538b\u7f29\uff0c\u4eae\u5ea6\u8303\u56f4\u4ece&nbsp;<code>[0.0005,&nbsp;10000]nit<\/code>&nbsp;\u538b\u7f29\u5230&nbsp;<code>[0.1,&nbsp;100]nit<\/code>\uff0c\u989c\u8272\u7a7a\u95f4\u4ece BT.2020 \u8f6c\u6362\u5230 BT.709\uff1b\u540c\u65f6\u989c\u8272\u4f4d\u6df1\u4e5f\u7531 10bit \u964d\u4f4e\u5230 8bit\uff1b\u89c6\u9891\u4fe1\u53f7\u53ef\u7528\u7684\u8272\u9636\u6570\u91cf\u4ece 1024 \u964d\u4f4e\u5230 256 \u4e2a\uff0c\u51cf\u5c11\u4e86 75%\uff1b\u540c\u65f6\u5149\u7535\u8f6c\u6362\u51fd\u6570 EOTF \u4e5f\u4f1a\u53d8\u5316\uff0c\u4ece PQ \u6216 HLG \u53d8\u4e3a BT.709 Gamma\u3002<\/p>\n\n\n\n<p>\u5b9e\u73b0 HDR \u8f6c SDR \u89c6\u9891\u7684\u65b9\u6848\u6709\u4e0b\u9762\u51e0\u79cd\u53ef\u4f9b\u53c2\u8003\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1\u3001\u4f7f\u7528 FFmpeg filter \u5b9e\u73b0\u8f6c\u6362<\/h3>\n\n\n\n<p>\u5229\u7528 FFmpeg \u547d\u4ee4\u884c\u5b9e\u73b0 HDR \u8f6c SDR\uff0c\u4e3b\u8981\u662f\u5e94\u7528\u4e86 FFmpeg \u4e2d&nbsp;<code>zscale<\/code>\uff08\u4f9d\u8d56 zimg\uff09\u4ee5\u53ca&nbsp;<code>tonemap<\/code>&nbsp;\u8fd9\u4e24\u4e2a filter\uff0c\u8981\u4f7f\u7528 zscale\uff0c\u5fc5\u987b\u786e\u8ba4 FFmpeg \u7f16\u8bd1\u65f6\u6709\u5f00\u542f&nbsp;<code>--enable-libzimg<\/code>\u3002\u5176\u4e2d&nbsp;<code>zimg<\/code>&nbsp;\u662f\u4e00\u4e2a\u5b9e\u73b0\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u7684\u4e09\u65b9\u5e93\uff1a<a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsekrit-twc%2Fzimg%255B4%255D%25E3%2580%2582\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/sekrit-twc\/\u2026<\/a><\/p>\n\n\n\n<p>FFmpeg \u5b9e\u73b0 HDR \u8f6c SDR \u7684\u547d\u4ee4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>ffmpeg&nbsp;-i&nbsp;&lt;input&gt;&nbsp;-vf&nbsp;\\&nbsp;&nbsp;#&nbsp;-vf&nbsp;\u540e\u9762\u8868\u793a\u662f&nbsp;video&nbsp;filter&nbsp;\u7684\u4e00\u7cfb\u5217\u547d\u4ee4&nbsp; zscale=t=linear:npl=100,&nbsp;\\&nbsp;&nbsp;#&nbsp;1\uff09\u975e\u7ebf\u6027\u8f6c\u7ebf\u6027\u3002\u6307\u5b9a&nbsp;zscale&nbsp;\u6a21\u5757\u7684\u8f6c\u6362\u51fd\u6570\u4e3a&nbsp;linear\uff0c\u8f93\u5165\u53c2\u6570\u4e3a&nbsp;npl=100\uff0cnpl&nbsp;\u8868\u793a\u6807\u79f0\u5cf0\u503c\u4eae\u5ea6\uff08nominal&nbsp;peak&nbsp;luminance\uff09 format=gbrpf32le,&nbsp;\\&nbsp;&nbsp;#&nbsp;\u8f6c\u6362\u683c\u5f0f\u4e3a&nbsp;gbr\uff0c\u7528&nbsp;little&nbsp;end&nbsp;32&nbsp;\u4f4d\u6d6e\u70b9\u7c7b\u578b\u5b58\u50a8&nbsp;10bit&nbsp;\u989c\u8272\u901a\u9053 zscale=p=bt709,&nbsp;\\&nbsp;&nbsp;#&nbsp;2\uff09\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3002\u6307\u5b9a&nbsp;zscale&nbsp;\u6a21\u5757\u7684\u8272\u57df\u4e3a&nbsp;bt709 tonemap=tonemap=hable:desat=0,&nbsp;\\&nbsp;&nbsp;#&nbsp;3\uff09\u8272\u8c03\u6620\u5c04\u3002\u6307\u5b9a&nbsp;tonemapping&nbsp;\u8f6c\u6362\u7b97\u6cd5\u4e3a&nbsp;hable\uff0c\u8f93\u5165\u53c2\u6570&nbsp;desat=0 zscale=t=bt709:m=bt709:r=tv,&nbsp;\\&nbsp;&nbsp;#&nbsp;4\uff09\u7ebf\u6027\u8f6c\u975e\u7ebf\u6027\u3002\u6307\u5b9a&nbsp;zscale&nbsp;\u6a21\u5757\u7684\u8f6c\u6362\u51fd\u6570\u4e3a&nbsp;bt709\uff0c\u8f6c\u6362\u77e9\u9635\u4e3a&nbsp;bt709\uff0crange&nbsp;\u4e3a&nbsp;tv.limited format=yuv420p&nbsp;\\&nbsp;&nbsp;#&nbsp;\u8f6c\u6362\u683c\u5f0f\u4e3a&nbsp;yuv420p &lt;output&gt;<\/code><\/p>\n\n\n\n<p>\u4e0a\u9762\u7684\u547d\u4ee4\u662f\u4e00\u4e2a\u4e32\u8054\u6267\u884c\u6d41\u7a0b\uff0c\u987a\u5e8f\u4e5f\u5bf9\u5e94\u4e0a\u9762\u6211\u4eec\u63d0\u5230\u7684 HDR \u548c SDR \u8f6c\u6362\u6d41\u7a0b\u3002\u4e0b\u9762\u6211\u4eec\u4ee5\u4e00\u4e2a\u4f7f\u7528\u4e86 PQ \u6807\u51c6\u7684 HDR \u89c6\u9891\u4e3a\u4f8b\u6765\u4ecb\u7ecd\u4e00\u4e0b\u51e0\u4e2a\u5173\u952e\u6b65\u9aa4\u7684\u76f8\u5173\u4ee3\u7801\uff1a<\/p>\n\n\n\n<p><strong>1\uff09\u975e\u7ebf\u6027\u989c\u8272\u6570\u5b57\u4fe1\u53f7\u7ecf\u8fc7 EOTF \u8f6c\u6362\u4e3a\u7ebf\u6027\u7684\u6a21\u62df\u5149\u4fe1\u53f7\u3002<\/strong><\/p>\n\n\n\n<p>\u7b2c\u4e00\u4e2a\u6b65\u9aa4\u5bf9\u5e94\u4e0a\u7684\u547d\u4ee4\u53c2\u6570\uff1a<code>zscale=t=linear:npl=100<\/code>\uff0c\u8868\u793a\u76ee\u6807\u662f\u8981\u8f6c\u6362\u4e3a linear \u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7\uff0c\u6807\u79f0\u5cf0\u503c\u4eae\u5ea6\uff08nominal peak luminance\uff09\u4e3a 100\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u4ece&nbsp;zimg[5]&nbsp;\u6e90\u4ee3\u7801\u4e2d\u627e\u5230\u5173\u952e\u51fd\u6570\uff1a<\/p>\n\n\n\n<p>less<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/graph.cpp std::vector&lt;ColorspaceNode&gt;&nbsp;get_neighboring_colorspaces(const&nbsp;ColorspaceDefinition&nbsp;&amp;csp) { &nbsp;&nbsp;zassert_d(is_valid_csp(csp),&nbsp;\"invalid&nbsp;colorspace\"); &nbsp;&nbsp;std::vector&lt;ColorspaceNode&gt;&nbsp;edges; &nbsp;&nbsp;auto&nbsp;add_edge&nbsp;=&nbsp;[&amp;](const&nbsp;ColorspaceDefinition&nbsp;&amp;out_csp,&nbsp;auto&nbsp;func) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;edges.emplace_back(out_csp,&nbsp;std::bind(func,&nbsp;csp,&nbsp;out_csp,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2)); &nbsp;&nbsp;}; &nbsp;&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;constexpr&nbsp;MatrixCoefficients&nbsp;special_matrices[]&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::UNSPECIFIED, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::RGB, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2020_CL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_NCL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_CL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2100_LMS, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2100_ICTCP, &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;conventional&nbsp;YUV. &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;matrix&nbsp;:&nbsp;all_matrix())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(std::find(std::begin(special_matrices),&nbsp;std::end(special_matrices),&nbsp;matrix)&nbsp;==&nbsp;std::end(special_matrices)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(matrix),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::CHROMATICITY_DERIVED_NCL),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;Linear&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;other&nbsp;transfer&nbsp;functions&nbsp;and&nbsp;primaries;&nbsp;also&nbsp;to&nbsp;combined&nbsp;matrix-transfer&nbsp;systems. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;transfer&nbsp;:&nbsp;all_transfer())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(transfer&nbsp;!=&nbsp;csp.transfer&nbsp;&amp;&amp;&nbsp;transfer&nbsp;!=&nbsp;TransferCharacteristics::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(transfer),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(transfer).to(MatrixCoefficients::CHROMATICITY_DERIVED_CL),&nbsp;create_cl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;primaries&nbsp;:&nbsp;all_primaries())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(primaries&nbsp;!=&nbsp;csp.primaries&nbsp;&amp;&amp;&nbsp;primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(primaries),&nbsp;create_gamut_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2020_CL).to(TransferCharacteristics::REC_709),&nbsp;create_cl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;==&nbsp;ColorPrimaries::REC_2020) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_LMS),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.transfer&nbsp;!=&nbsp;TransferCharacteristics::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;Gamma&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;linear&nbsp;RGB. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_linear(),&nbsp;create_gamma_to_linear_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2020_CL&nbsp;||&nbsp;csp.matrix&nbsp;==&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_CL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb().to_linear(),&nbsp;create_cl_yuv_to_rgb_operation); &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_LMS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;LMS&nbsp;with&nbsp;ST_2084&nbsp;or&nbsp;ARIB_B67&nbsp;transfer&nbsp;functions&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;ICtCp&nbsp;and&nbsp;also&nbsp;to&nbsp;linear&nbsp;transfer&nbsp;function. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ST_2084&nbsp;||&nbsp;csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ARIB_B67)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_ICTCP),&nbsp;create_lms_to_ictcp_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::LINEAR),&nbsp;create_gamma_to_linear_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;LMS&nbsp;with&nbsp;linear&nbsp;transfer&nbsp;function&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;RGB&nbsp;matrix&nbsp;and&nbsp;to&nbsp;ARIB_B67&nbsp;and&nbsp;ST_2084&nbsp;transfer&nbsp;functions. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb(),&nbsp;create_ncl_yuv_to_rgb_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::ST_2084),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::ARIB_B67),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_ICTCP)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;ICtCp&nbsp;with&nbsp;ST_2084&nbsp;or&nbsp;ARIB_B67&nbsp;transfer&nbsp;functions&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;LMS. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ST_2084&nbsp;||&nbsp;csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ARIB_B67) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_LMS),&nbsp;create_ictcp_to_lms_operation); &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;!=&nbsp;MatrixCoefficients::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;YUV&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;RGB. &nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb(),&nbsp;create_ncl_yuv_to_rgb_operation); &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;edges; }<\/code><\/p>\n\n\n\n<p>EOTF \u8f6c\u6362\u4f1a\u5148\u8c03\u7528&nbsp;<code>get_neighboring_colorspaces<\/code>&nbsp;\u51fd\u6570\uff0c\u5e76\u521b\u5efa Gamma RGB \u2192 Linear RGB \u7684\u8f6c\u6362\u64cd\u4f5c\uff0c\u5373\u8c03\u7528&nbsp;<code>create_gamma_to_linear_operation<\/code>&nbsp;\u51fd\u6570\u3002<\/p>\n\n\n\n<p>csharp<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/operation.cpp std::unique_ptr&lt;Operation&gt;&nbsp;create_gamma_to_linear_operation(const&nbsp;ColorspaceDefinition&nbsp;&amp;in,&nbsp;const&nbsp;ColorspaceDefinition&nbsp;&amp;out,&nbsp;const&nbsp;OperationParams&nbsp;&amp;params,&nbsp;CPUClass&nbsp;cpu) { &nbsp;&nbsp;zassert_d(in.primaries&nbsp;==&nbsp;out.primaries,&nbsp;\"primaries&nbsp;mismatch\"); &nbsp;&nbsp;zassert_d((in.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB&nbsp;||&nbsp;in.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_LMS)&nbsp;&amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(out.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB&nbsp;||&nbsp;out.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_LMS),&nbsp;\"must&nbsp;be&nbsp;RGB&nbsp;or&nbsp;LMS\"); &nbsp;&nbsp;zassert_d(in.transfer&nbsp;!=&nbsp;TransferCharacteristics::LINEAR&nbsp;&amp;&amp;&nbsp;out.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR,&nbsp;\"wrong&nbsp;transfer&nbsp;characteristics\"); &nbsp; &nbsp;&nbsp;if&nbsp;(in.transfer&nbsp;==&nbsp;TransferCharacteristics::ARIB_B67&nbsp;&amp;&amp;&nbsp;use_display_referred_b67(in.primaries,&nbsp;params)) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;create_inverse_arib_b67_operation(ncl_rgb_to_yuv_matrix_from_primaries(in.primaries),&nbsp;params); &nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;create_inverse_gamma_operation(select_transfer_function(in.transfer,&nbsp;params.peak_luminance,&nbsp;params.scene_referred),&nbsp;params,&nbsp;cpu); }<\/code><\/p>\n\n\n\n<p>\u7531\u4e8e\u73b0\u5728\u662f\u6309\u7167 PQ \u6807\u51c6\u505a\u8f6c\u6362\uff0c\u6240\u4ee5&nbsp;<code>in.transfer<\/code>&nbsp;\u4e0d\u7b49\u4e8e&nbsp;<code>ARIB_B67<\/code>(\u8fd9\u662f HLG \u6807\u51c6)\uff0c\u4f1a\u63a5\u7740\u8c03\u7528&nbsp;<code>create_inverse_gamma_operation<\/code>&nbsp;\u51fd\u6570\u3002<\/p>\n\n\n\n<p>arduino<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/operation_impl.cpp \/\/&nbsp;GammaOperationC&nbsp;\u7c7b\uff1a class&nbsp;GammaOperationC&nbsp;final&nbsp;:&nbsp;public&nbsp;Operation&nbsp;{ &nbsp;&nbsp;gamma_func&nbsp;m_func; &nbsp;&nbsp;float&nbsp;m_prescale; &nbsp;&nbsp;float&nbsp;m_postscale; public: &nbsp;&nbsp;GammaOperationC(gamma_func&nbsp;func,&nbsp;float&nbsp;prescale,&nbsp;float&nbsp;postscale)&nbsp;: &nbsp;&nbsp;&nbsp;&nbsp;m_func{&nbsp;func&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;m_prescale{&nbsp;prescale&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;m_postscale{&nbsp;postscale&nbsp;} &nbsp;&nbsp;{} &nbsp;&nbsp;void&nbsp;process(const&nbsp;float&nbsp;*&nbsp;const&nbsp;*src,&nbsp;float&nbsp;*&nbsp;const&nbsp;*dst,&nbsp;unsigned&nbsp;left,&nbsp;unsigned&nbsp;right)&nbsp;const&nbsp;override &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;EnsureSinglePrecision&nbsp;x87; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(unsigned&nbsp;p&nbsp;=&nbsp;0;&nbsp;p&nbsp;&lt;&nbsp;3;&nbsp;++p)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;float&nbsp;*src_p&nbsp;=&nbsp;src[p]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;*dst_p&nbsp;=&nbsp;dst[p]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(unsigned&nbsp;i&nbsp;=&nbsp;left;&nbsp;i&nbsp;&lt;&nbsp;right;&nbsp;++i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dst_p[i]&nbsp;=&nbsp;m_postscale&nbsp;*&nbsp;m_func(src_p[i]&nbsp;*&nbsp;m_prescale); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} }; \/\/&nbsp;... \/\/&nbsp;create_inverse_gamma_operation&nbsp;\u51fd\u6570\uff1a std::unique_ptr&lt;Operation&gt;&nbsp;create_inverse_gamma_operation(const&nbsp;TransferFunction&nbsp;&amp;transfer,&nbsp;const&nbsp;OperationParams&nbsp;&amp;params,&nbsp;CPUClass&nbsp;cpu) { &nbsp;&nbsp;std::unique_ptr&lt;Operation&gt;&nbsp;ret; &nbsp; #if&nbsp;defined(ZIMG_X86) &nbsp;&nbsp;ret&nbsp;=&nbsp;create_inverse_gamma_operation_x86(transfer,&nbsp;params,&nbsp;cpu); #elif&nbsp;defined(ZIMG_ARM) &nbsp;&nbsp;ret&nbsp;=&nbsp;create_inverse_gamma_operation_arm(transfer,&nbsp;params,&nbsp;cpu); #endif &nbsp;&nbsp;if&nbsp;(!ret) &nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;std::make_unique&lt;GammaOperationC&gt;(transfer.to_linear,&nbsp;1.0f,&nbsp;transfer.to_linear_scale); &nbsp; &nbsp;&nbsp;return&nbsp;ret; }<\/code><\/p>\n\n\n\n<p>\u6682\u65f6\u4e0d\u8003\u8651\u5e73\u53f0\u52a0\u901f\u7684\u4ee3\u7801\uff0c\u8fd9\u91cc\u5219\u662f\u8981\u6784\u5efa\u4e86\u4e00\u4e2a&nbsp;<code>GammaOperationC<\/code>\u3002\u6784\u5efa&nbsp;<code>GammaOperationC<\/code>&nbsp;\u6700\u91cd\u8981\u7684\u53c2\u6570\u662f\u8f6c\u6362\u51fd\u6570\u5bf9\u8c61\uff1a<code>TransferFunction<\/code>\u3002\u7531\u4e8e\u8fd9\u91cc\u662f\u8981\u8f6c\u4e3a\u7ebf\u6027\u5149\u4fe1\u53f7\uff0c\u6240\u4ee5\u662f\u53d6\u7684\u662f&nbsp;<code>TransferFunction<\/code>&nbsp;\u5bf9\u8c61\u7684&nbsp;<code>to_linear<\/code>&nbsp;\u548c&nbsp;<code>to_linear_scale<\/code>&nbsp;\u5c5e\u6027\u3002\u8fd9\u4e2a\u5bf9\u8c61\u662f\u4e4b\u524d\u8c03\u7528&nbsp;<code>select_transfer_function<\/code>&nbsp;\u51fd\u6570\u6765\u83b7\u5f97\u7684\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/gamma.cpp TransferFunction&nbsp;select_transfer_function(TransferCharacteristics&nbsp;transfer,&nbsp;double&nbsp;peak_luminance,&nbsp;bool&nbsp;scene_referred) { &nbsp;&nbsp;zassert_d(!std::isnan(peak_luminance),&nbsp;\"nan&nbsp;detected\"); &nbsp; &nbsp;&nbsp;TransferFunction&nbsp;func{}; &nbsp; &nbsp;&nbsp;func.to_linear_scale&nbsp;=&nbsp;1.0f; &nbsp;&nbsp;func.to_gamma_scale&nbsp;=&nbsp;1.0f; &nbsp; &nbsp;&nbsp;switch&nbsp;(transfer)&nbsp;{ &nbsp;&nbsp;\/\/&nbsp;...&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TransferCharacteristics::REC_709: &nbsp;&nbsp;&nbsp;&nbsp;func.to_linear&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;rec_709_inverse_oetf&nbsp;:&nbsp;rec_1886_eotf; &nbsp;&nbsp;&nbsp;&nbsp;func.to_gamma&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;rec_709_oetf&nbsp;:&nbsp;rec_1886_inverse_eotf; &nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;case&nbsp;TransferCharacteristics::ST_2084: &nbsp;&nbsp;&nbsp;&nbsp;func.to_linear&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;st_2084_inverse_oetf&nbsp;:&nbsp;st_2084_eotf; &nbsp;&nbsp;&nbsp;&nbsp;func.to_gamma&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;st_2084_oetf&nbsp;:&nbsp;st_2084_inverse_eotf; &nbsp;&nbsp;&nbsp;&nbsp;func.to_linear_scale&nbsp;=&nbsp;static_cast&lt;float&gt;(ST2084_PEAK_LUMINANCE&nbsp;\/&nbsp;peak_luminance); &nbsp;&nbsp;&nbsp;&nbsp;func.to_gamma_scale&nbsp;=&nbsp;static_cast&lt;float&gt;(peak_luminance&nbsp;\/&nbsp;ST2084_PEAK_LUMINANCE); &nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;case&nbsp;TransferCharacteristics::ARIB_B67: &nbsp;&nbsp;&nbsp;&nbsp;func.to_linear&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;arib_b67_inverse_oetf&nbsp;:&nbsp;arib_b67_eotf; &nbsp;&nbsp;&nbsp;&nbsp;func.to_gamma&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;arib_b67_oetf&nbsp;:&nbsp;arib_b67_inverse_eotf; &nbsp;&nbsp;&nbsp;&nbsp;func.to_linear_scale&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;12.0f&nbsp;:&nbsp;static_cast&lt;float&gt;(1000.0&nbsp;\/&nbsp;peak_luminance); &nbsp;&nbsp;&nbsp;&nbsp;func.to_gamma_scale&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;1.0f&nbsp;\/&nbsp;12.0f&nbsp;:&nbsp;static_cast&lt;float&gt;(peak_luminance&nbsp;\/&nbsp;1000.0); &nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;default: &nbsp;&nbsp;&nbsp;&nbsp;error::throw_&lt;error::InternalError&gt;(\"invalid&nbsp;transfer&nbsp;characteristics\"); &nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;return&nbsp;func; }<\/code><\/p>\n\n\n\n<p>\u4ece\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\uff0c\u56e0\u4e3a\u6211\u4eec\u8fd9\u91cc PQ \u66f2\u7ebf\u5bf9\u5e94\u7684\u662f SMPTE ST 2084 \u6807\u51c6\uff0c\u8f6c\u6362\u51fd\u6570&nbsp;<code>to_linear<\/code>&nbsp;\u5373&nbsp;<code>st_2084_eotf<\/code>\uff0c<code>to_linear_scale<\/code>&nbsp;\u5219\u4e3a&nbsp;<code>ST2084_PEAK_LUMINANCE \/ peak_luminance<\/code>\u3002<\/p>\n\n\n\n<p><code>st_2084_eotf<\/code>&nbsp;\u51fd\u6570\u7684\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/gamma.cpp constexpr&nbsp;float&nbsp;ST2084_M1&nbsp;=&nbsp;0.1593017578125f; constexpr&nbsp;float&nbsp;ST2084_M2&nbsp;=&nbsp;78.84375f; constexpr&nbsp;float&nbsp;ST2084_C1&nbsp;=&nbsp;0.8359375f; constexpr&nbsp;float&nbsp;ST2084_C2&nbsp;=&nbsp;18.8515625f; constexpr&nbsp;float&nbsp;ST2084_C3&nbsp;=&nbsp;18.6875f;&nbsp;&nbsp;&nbsp; constexpr&nbsp;float&nbsp;FLT_MIN&nbsp;1.17549435082228750797e-38F float&nbsp;st_2084_eotf(float&nbsp;x)&nbsp;noexcept { &nbsp;&nbsp;\/\/&nbsp;Filter&nbsp;negative&nbsp;values&nbsp;to&nbsp;avoid&nbsp;NAN. &nbsp;&nbsp;if&nbsp;(x&nbsp;&gt;&nbsp;0.0f)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;xpow&nbsp;=&nbsp;zimg_x_powf(x,&nbsp;1.0f&nbsp;\/&nbsp;ST2084_M2); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;num&nbsp;=&nbsp;std::max(xpow&nbsp;-&nbsp;ST2084_C1,&nbsp;0.0f); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;den&nbsp;=&nbsp;std::max(ST2084_C2&nbsp;-&nbsp;ST2084_C3&nbsp;*&nbsp;xpow,&nbsp;FLT_MIN); &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;zimg_x_powf(num&nbsp;\/&nbsp;den,&nbsp;1.0f&nbsp;\/&nbsp;ST2084_M1); &nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;0.0f; &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;x; }<\/code><\/p>\n\n\n\n<p>\u5230\u8fd9\u91cc\uff0c\u5904\u7406\u4e00\u4e2a\u4f7f\u7528\u4e86 PQ \u6807\u51c6\u7684 HDR \u89c6\u9891\uff0c\u53bb\u83b7\u53d6\u5bf9\u5e94 EOTF \u8f6c\u6362\u51fd\u6570\u53ca\u53c2\u6570\u7684\u6838\u5fc3\u6b65\u9aa4\u5c31\u4ecb\u7ecd\u5b8c\u4e86\u3002\u603b\u7ed3\u8d77\u6765\u4e3b\u8981\u6b65\u9aa4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>get_neighboring_colorspaces &nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;create_gamma_to_linear_operation &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;create_inverse_gamma_operation &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;select_transfer_function &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TransferCharacteristics::ST_2084: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func.to_linear&nbsp;=&nbsp;scene_referred&nbsp;?&nbsp;st_2084_inverse_oetf&nbsp;:&nbsp;st_2084_eotf; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func.to_linear_scale&nbsp;=&nbsp;static_cast&lt;float&gt;(ST2084_PEAK_LUMINANCE&nbsp;\/&nbsp;peak_luminance); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<\/code><\/p>\n\n\n\n<p><strong>2\uff09HDR \u7ebf\u6027\u5149\u4fe1\u53f7\u505a\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3002<\/strong><\/p>\n\n\n\n<p>\u7531\u4e8e HDR \u548c SDR \u4f7f\u7528\u7684\u989c\u8272\u7a7a\u95f4\u662f\u4e0d\u540c\u7684\uff0cHDR \u901a\u5e38\u4f7f\u7528 BT.2020\uff0cSDR \u901a\u5e38\u7528 BT.709\uff0c\u6240\u4ee5\u8981\u505a\u4e00\u4e0b\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3002<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u6b65\u9aa4\u5bf9\u5e94\u7684\u547d\u4ee4\u53c2\u6570\uff1a<code>zscale=p=bt709<\/code>\uff0c\u8868\u793a\u8f6c\u6362\u7684\u76ee\u6807\u989c\u8272\u7a7a\u95f4\u662f bt709\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u4e3b\u8981\u662f\u6839\u636e\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u77e9\u9635\u6765\u505a\u4e00\u4e0b\u8f6c\u6362\u5373\u53ef\u3002\u6211\u4eec\u8fd8\u662f\u53ef\u4ee5\u4ece&nbsp;zimg[6]&nbsp;\u6e90\u4ee3\u7801\u4e2d\u627e\u5230\u5173\u952e\u51fd\u6570\uff1a<\/p>\n\n\n\n<p>\u5ef6\u65f6\u7a7a\u95f4\u7684\u8f6c\u6362\u4e5f\u4f1a\u5148\u8c03\u7528&nbsp;<code>get_neighboring_colorspaces<\/code>&nbsp;\u51fd\u6570\u3002<\/p>\n\n\n\n<p>less<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/graph.cpp \/\/&nbsp;\u521b\u5efa\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u51fd\u6570 std::vector&lt;ColorspaceNode&gt;&nbsp;get_neighboring_colorspaces(const&nbsp;ColorspaceDefinition&nbsp;&amp;csp) { &nbsp;&nbsp;zassert_d(is_valid_csp(csp),&nbsp;\"invalid&nbsp;colorspace\"); &nbsp;&nbsp;std::vector&lt;ColorspaceNode&gt;&nbsp;edges; &nbsp;&nbsp;auto&nbsp;add_edge&nbsp;=&nbsp;[&amp;](const&nbsp;ColorspaceDefinition&nbsp;&amp;out_csp,&nbsp;auto&nbsp;func) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;edges.emplace_back(out_csp,&nbsp;std::bind(func,&nbsp;csp,&nbsp;out_csp,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2)); &nbsp;&nbsp;}; &nbsp;&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;constexpr&nbsp;MatrixCoefficients&nbsp;special_matrices[]&nbsp;=&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::UNSPECIFIED, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::RGB, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2020_CL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_NCL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_CL, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2100_LMS, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MatrixCoefficients::REC_2100_ICTCP, &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;conventional&nbsp;YUV. &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;matrix&nbsp;:&nbsp;all_matrix())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(std::find(std::begin(special_matrices),&nbsp;std::end(special_matrices),&nbsp;matrix)&nbsp;==&nbsp;std::end(special_matrices)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(matrix),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::CHROMATICITY_DERIVED_NCL),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;Linear&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;other&nbsp;transfer&nbsp;functions&nbsp;and&nbsp;primaries;&nbsp;also&nbsp;to&nbsp;combined&nbsp;matrix-transfer&nbsp;systems. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;transfer&nbsp;:&nbsp;all_transfer())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(transfer&nbsp;!=&nbsp;csp.transfer&nbsp;&amp;&amp;&nbsp;transfer&nbsp;!=&nbsp;TransferCharacteristics::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(transfer),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(transfer).to(MatrixCoefficients::CHROMATICITY_DERIVED_CL),&nbsp;create_cl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&nbsp;primaries&nbsp;:&nbsp;all_primaries())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(primaries&nbsp;!=&nbsp;csp.primaries&nbsp;&amp;&amp;&nbsp;primaries&nbsp;!=&nbsp;ColorPrimaries::UNSPECIFIED) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(primaries),&nbsp;create_gamut_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2020_CL).to(TransferCharacteristics::REC_709),&nbsp;create_cl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.primaries&nbsp;==&nbsp;ColorPrimaries::REC_2020) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_LMS),&nbsp;create_ncl_rgb_to_yuv_operation); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.transfer&nbsp;!=&nbsp;TransferCharacteristics::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;Gamma&nbsp;RGB&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;linear&nbsp;RGB. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_linear(),&nbsp;create_gamma_to_linear_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2020_CL&nbsp;||&nbsp;csp.matrix&nbsp;==&nbsp;MatrixCoefficients::CHROMATICITY_DERIVED_CL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb().to_linear(),&nbsp;create_cl_yuv_to_rgb_operation); &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_LMS)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;LMS&nbsp;with&nbsp;ST_2084&nbsp;or&nbsp;ARIB_B67&nbsp;transfer&nbsp;functions&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;ICtCp&nbsp;and&nbsp;also&nbsp;to&nbsp;linear&nbsp;transfer&nbsp;function. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ST_2084&nbsp;||&nbsp;csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ARIB_B67)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_ICTCP),&nbsp;create_lms_to_ictcp_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::LINEAR),&nbsp;create_gamma_to_linear_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;LMS&nbsp;with&nbsp;linear&nbsp;transfer&nbsp;function&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;RGB&nbsp;matrix&nbsp;and&nbsp;to&nbsp;ARIB_B67&nbsp;and&nbsp;ST_2084&nbsp;transfer&nbsp;functions. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb(),&nbsp;create_ncl_yuv_to_rgb_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::ST_2084),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(TransferCharacteristics::ARIB_B67),&nbsp;create_linear_to_gamma_operation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;==&nbsp;MatrixCoefficients::REC_2100_ICTCP)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;ICtCp&nbsp;with&nbsp;ST_2084&nbsp;or&nbsp;ARIB_B67&nbsp;transfer&nbsp;functions&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;LMS. &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ST_2084&nbsp;||&nbsp;csp.transfer&nbsp;==&nbsp;TransferCharacteristics::ARIB_B67) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to(MatrixCoefficients::REC_2100_LMS),&nbsp;create_ictcp_to_lms_operation); &nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(csp.matrix&nbsp;!=&nbsp;MatrixCoefficients::UNSPECIFIED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;YUV&nbsp;can&nbsp;be&nbsp;converted&nbsp;to&nbsp;RGB. &nbsp;&nbsp;&nbsp;&nbsp;add_edge(csp.to_rgb(),&nbsp;create_ncl_yuv_to_rgb_operation); &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;edges; }<\/code><\/p>\n\n\n\n<p>\u5728&nbsp;<code>get_neighboring_colorspaces<\/code>&nbsp;\u51fd\u6570\u4e2d\u4f1a\u6839\u636e ColorPrimaries \u7684\u5dee\u5f02\u6765\u5c06&nbsp;<code>ZIMG_PRIMARIES_BT2020<\/code>&nbsp;\u8f6c\u6362\u4e3a&nbsp;<code>ZIMG_PRIMARIES_BT709<\/code>\uff0c\u8fd9\u4e2a\u8fc7\u7a0b\u4f1a\u8c03\u7528&nbsp;<code>create_gamut_operation<\/code>&nbsp;\u8fdb\u884c rgb \u4e0e xyz \u5bf9\u5e94\u989c\u8272\u7a7a\u95f4\u7684\u8f6c\u6362\u3002<\/p>\n\n\n\n<p>csharp<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/operation.cpp \/\/&nbsp;\u521b\u5efa&nbsp;rgb&nbsp;\u4e0e&nbsp;xyz&nbsp;\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u77e9\u9635 std::unique_ptr&lt;Operation&gt;&nbsp;create_gamut_operation(const&nbsp;ColorspaceDefinition&nbsp;&amp;in,&nbsp;const&nbsp;ColorspaceDefinition&nbsp;&amp;out,&nbsp;const&nbsp;OperationParams&nbsp;&amp;params,&nbsp;CPUClass&nbsp;cpu) { &nbsp;&nbsp;zassert_d(in.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB&nbsp;&amp;&amp;&nbsp;in.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR,&nbsp;\"must&nbsp;be&nbsp;linear&nbsp;RGB\"); &nbsp;&nbsp;zassert_d(out.matrix&nbsp;==&nbsp;MatrixCoefficients::RGB&nbsp;&amp;&amp;&nbsp;out.transfer&nbsp;==&nbsp;TransferCharacteristics::LINEAR,&nbsp;\"must&nbsp;be&nbsp;linear&nbsp;RGB\"); &nbsp;&nbsp;Matrix3x3&nbsp;m&nbsp;=&nbsp;gamut_xyz_to_rgb_matrix(out.primaries)&nbsp;*&nbsp;white_point_adaptation_matrix(in.primaries,&nbsp;out.primaries)&nbsp;*&nbsp;gamut_rgb_to_xyz_matrix(in.primaries); &nbsp;&nbsp;return&nbsp;create_matrix_operation(m,&nbsp;cpu); }<\/code><\/p>\n\n\n\n<p>\u8fd9\u91cc\u7684\u5b9e\u73b0\u662f\u7528 CIE XYZ \u989c\u8272\u7a7a\u95f4\u4f5c\u4e3a\u4e2d\u8f6c\uff0c\u5148\u628a\u539f\u989c\u8272\u7a7a\u95f4\u8f6c\u4e3a XYZ \u989c\u8272\u7a7a\u95f4\uff0c\u518d\u628a XYZ \u989c\u8272\u7a7a\u95f4\u8f6c\u4e3a\u76ee\u6807\u989c\u8272\u7a7a\u95f4\uff0c\u6574\u4e2a\u6b65\u9aa4\u53ef\u4ee5\u7406\u89e3\u4e3a\u50cf\u7d20\u76f4\u63a5\u548c\u4e24\u4e2a\u8f6c\u6362\u77e9\u9635\u76f8\u4e58\u3002\u5176\u4e2d\u5bf9\u5e94\u7684 BT.2020 RGB \u8f6c XYZ \u989c\u8272\u7a7a\u95f4\u3001XYZ \u8f6c BT.709 \u989c\u8272\u7a7a\u95f4\u7684\u77e9\u9635\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>arduino<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;BT2020 RGB2XYZ&nbsp;Matrix: 0.6370,&nbsp;0.1446,&nbsp;0.1689 0.2627,&nbsp;0.6780,&nbsp;0.0593 0.0000,&nbsp;0.0281,&nbsp;1.0610 \/\/&nbsp;BT709 XYZ2RGB&nbsp;Matrix: 3.2410,&nbsp;-1.5374,&nbsp;-0.4986 -0.9692,&nbsp;1.8760,&nbsp;0.0416 0.0556,&nbsp;-0.2040,&nbsp;1.0570<\/code><\/p>\n\n\n\n<p>\u603b\u7ed3\u4e00\u4e0b\u4e0a\u8ff0\u8fc7\u7a0b\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>rust<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>get_neighboring_colorspaces &nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;create_gamut_operation &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;gamut_xyz_to_rgb_matrix&nbsp;&amp;&amp;&nbsp;gamut_rgb_to_xyz_matrix<\/code><\/p>\n\n\n\n<p><strong>3\uff09HDR \u7684\u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7 ToneMapping \u8f6c\u6362\u5230 SDR \u7684\u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7\u3002<\/strong><\/p>\n\n\n\n<p>\u901a\u8fc7\u4e0a\u4e00\u6b65\u83b7\u5f97\u7684 EOTF \u8f6c\u6362\u51fd\u6570\uff0c\u5b8c\u6210\u989c\u8272\u6570\u5b57\u4fe1\u53f7\u8f6c\u6362\u4e3a\u7ebf\u6027\u7684\u6a21\u62df\u5149\u4fe1\u53f7\u540e\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u8981\u505a\u7684\u662f\u5c06 HDR \u7684\u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7 ToneMapping \u8f6c\u6362\u5230 SDR \u7684\u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7\u3002<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u6b65\u9aa4\u5bf9\u5e94\u7684\u547d\u4ee4\u53c2\u6570\uff1a<code>tonemap=tonemap=hable:desat=0<\/code>\uff0c\u8868\u793a tonemap \u7684\u7b97\u6cd5\u7528 hable\uff0c\u51cf\u9971\u548c\u5f3a\u5ea6\uff08desaturation strength\uff09\u4e3a 0\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u7528\u5230\u7684\u6838\u5fc3\u4ee3\u7801\u662f&nbsp;FFmpeg[7]&nbsp;\u7684\u89c6\u9891\u6ee4\u955c\u6a21\u5757\u4e2d\u7684&nbsp;ffmpeg\/libavfilter\/vf_tonemap.c[8]\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;ffmpeg\/libavfilter\/vf_tonemap.c #define&nbsp;MIX(x,y,a)&nbsp;(x)&nbsp;*&nbsp;(1&nbsp;-&nbsp;(a))&nbsp;+&nbsp;(y)&nbsp;*&nbsp;(a) static&nbsp;void&nbsp;tonemap(TonemapContext&nbsp;*s,&nbsp;AVFrame&nbsp;*out,&nbsp;const&nbsp;AVFrame&nbsp;*in, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AVPixFmtDescriptor&nbsp;*desc,&nbsp;int&nbsp;x,&nbsp;int&nbsp;y,&nbsp;double&nbsp;peak) { &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;map[3]&nbsp;=&nbsp;{&nbsp;desc-&gt;comp[0].plane,&nbsp;desc-&gt;comp[1].plane,&nbsp;desc-&gt;comp[2].plane&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;float&nbsp;*r_in&nbsp;=&nbsp;(const&nbsp;float&nbsp;*)(in-&gt;data[map[0]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[0]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;in-&gt;linesize[map[0]]); &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;float&nbsp;*g_in&nbsp;=&nbsp;(const&nbsp;float&nbsp;*)(in-&gt;data[map[1]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[1]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;in-&gt;linesize[map[1]]); &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;float&nbsp;*b_in&nbsp;=&nbsp;(const&nbsp;float&nbsp;*)(in-&gt;data[map[2]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[2]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;in-&gt;linesize[map[2]]); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;*r_out&nbsp;=&nbsp;(float&nbsp;*)(out-&gt;data[map[0]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[0]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;out-&gt;linesize[map[0]]); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;*g_out&nbsp;=&nbsp;(float&nbsp;*)(out-&gt;data[map[1]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[1]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;out-&gt;linesize[map[1]]); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;*b_out&nbsp;=&nbsp;(float&nbsp;*)(out-&gt;data[map[2]]&nbsp;+&nbsp;x&nbsp;*&nbsp;desc-&gt;comp[map[2]].step&nbsp;+&nbsp;y&nbsp;*&nbsp;out-&gt;linesize[map[2]]); &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;sig,&nbsp;sig_orig; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;load&nbsp;values&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;*r_out&nbsp;=&nbsp;*r_in; &nbsp;&nbsp;&nbsp;&nbsp;*g_out&nbsp;=&nbsp;*g_in; &nbsp;&nbsp;&nbsp;&nbsp;*b_out&nbsp;=&nbsp;*b_in; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;desaturate&nbsp;to&nbsp;prevent&nbsp;unnatural&nbsp;colors&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s-&gt;desat&nbsp;&gt;&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;luma&nbsp;=&nbsp;s-&gt;coeffs-&gt;cr&nbsp;*&nbsp;*r_in&nbsp;+&nbsp;s-&gt;coeffs-&gt;cg&nbsp;*&nbsp;*g_in&nbsp;+&nbsp;s-&gt;coeffs-&gt;cb&nbsp;*&nbsp;*b_in; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;overbright&nbsp;=&nbsp;FFMAX(luma&nbsp;-&nbsp;s-&gt;desat,&nbsp;1e-6)&nbsp;\/&nbsp;FFMAX(luma,&nbsp;1e-6); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r_out&nbsp;=&nbsp;MIX(*r_in,&nbsp;luma,&nbsp;overbright); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*g_out&nbsp;=&nbsp;MIX(*g_in,&nbsp;luma,&nbsp;overbright); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*b_out&nbsp;=&nbsp;MIX(*b_in,&nbsp;luma,&nbsp;overbright); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;pick&nbsp;the&nbsp;brightest&nbsp;component,&nbsp;reducing&nbsp;the&nbsp;value&nbsp;range&nbsp;as&nbsp;necessary &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;keep&nbsp;the&nbsp;entire&nbsp;signal&nbsp;in&nbsp;range&nbsp;and&nbsp;preventing&nbsp;discoloration&nbsp;due&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;out-of-bounds&nbsp;clipping&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;FFMAX(FFMAX3(*r_out,&nbsp;*g_out,&nbsp;*b_out),&nbsp;1e-6); &nbsp;&nbsp;&nbsp;&nbsp;sig_orig&nbsp;=&nbsp;sig; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;switch(s-&gt;tonemap)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;default: &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_NONE: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;do&nbsp;nothing &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_LINEAR: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;sig&nbsp;*&nbsp;s-&gt;param&nbsp;\/&nbsp;peak; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_GAMMA: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;sig&nbsp;&gt;&nbsp;0.05f&nbsp;?&nbsp;pow(sig&nbsp;\/&nbsp;peak,&nbsp;1.0f&nbsp;\/&nbsp;s-&gt;param) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;sig&nbsp;*&nbsp;pow(0.05f&nbsp;\/&nbsp;peak,&nbsp;1.0f&nbsp;\/&nbsp;s-&gt;param)&nbsp;\/&nbsp;0.05f; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_CLIP: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;av_clipf(sig&nbsp;*&nbsp;s-&gt;param,&nbsp;0,&nbsp;1.0f); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_HABLE: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;hable(sig)&nbsp;\/&nbsp;hable(peak); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_REINHARD: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;sig&nbsp;\/&nbsp;(sig&nbsp;+&nbsp;s-&gt;param)&nbsp;*&nbsp;(peak&nbsp;+&nbsp;s-&gt;param)&nbsp;\/&nbsp;peak; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;TONEMAP_MOBIUS: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;mobius(sig,&nbsp;s-&gt;param,&nbsp;peak); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/*&nbsp;apply&nbsp;the&nbsp;computed&nbsp;scale&nbsp;factor&nbsp;to&nbsp;the&nbsp;color, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;linearly&nbsp;to&nbsp;prevent&nbsp;discoloration&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;*r_out&nbsp;*=&nbsp;sig&nbsp;\/&nbsp;sig_orig; &nbsp;&nbsp;&nbsp;&nbsp;*g_out&nbsp;*=&nbsp;sig&nbsp;\/&nbsp;sig_orig; &nbsp;&nbsp;&nbsp;&nbsp;*b_out&nbsp;*=&nbsp;sig&nbsp;\/&nbsp;sig_orig; }<\/code><\/p>\n\n\n\n<p>\u8fd9\u91cc\u4f7f\u7528\u7684 tonemap \u7b97\u6cd5\u662f hable\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>css<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;ffmpeg\/libavfilter\/vf_tonemap.c static&nbsp;float&nbsp;hable(float&nbsp;in) { &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;a&nbsp;=&nbsp;0.15f,&nbsp;b&nbsp;=&nbsp;0.50f,&nbsp;c&nbsp;=&nbsp;0.10f,&nbsp;d&nbsp;=&nbsp;0.20f,&nbsp;e&nbsp;=&nbsp;0.02f,&nbsp;f&nbsp;=&nbsp;0.30f; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(in&nbsp;*&nbsp;(in&nbsp;*&nbsp;a&nbsp;+&nbsp;b&nbsp;*&nbsp;c)&nbsp;+&nbsp;d&nbsp;*&nbsp;e)&nbsp;\/&nbsp;(in&nbsp;*&nbsp;(in&nbsp;*&nbsp;a&nbsp;+&nbsp;b)&nbsp;+&nbsp;d&nbsp;*&nbsp;f)&nbsp;-&nbsp;e&nbsp;\/&nbsp;f; } static&nbsp;float&nbsp;mobius(float&nbsp;in,&nbsp;float&nbsp;j,&nbsp;double&nbsp;peak) { &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;a,&nbsp;b; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(in&nbsp;&lt;=&nbsp;j) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;in; &nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;-j&nbsp;*&nbsp;j&nbsp;*&nbsp;(peak&nbsp;-&nbsp;1.0f)&nbsp;\/&nbsp;(j&nbsp;*&nbsp;j&nbsp;-&nbsp;2.0f&nbsp;*&nbsp;j&nbsp;+&nbsp;peak); &nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;(j&nbsp;*&nbsp;j&nbsp;-&nbsp;2.0f&nbsp;*&nbsp;j&nbsp;*&nbsp;peak&nbsp;+&nbsp;peak)&nbsp;\/&nbsp;FFMAX(peak&nbsp;-&nbsp;1.0f,&nbsp;1e-6); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(b&nbsp;*&nbsp;b&nbsp;+&nbsp;2.0f&nbsp;*&nbsp;b&nbsp;*&nbsp;j&nbsp;+&nbsp;j&nbsp;*&nbsp;j)&nbsp;\/&nbsp;(b&nbsp;-&nbsp;a)&nbsp;*&nbsp;(in&nbsp;+&nbsp;a)&nbsp;\/&nbsp;(in&nbsp;+&nbsp;b); }<\/code><\/p>\n\n\n\n<p>tonemap \u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\u7f16\u7801\u538b\u7f29\u66f2\u7ebf\uff0c\u53ef\u4ee5\u7b80\u5355\u7684\u7406\u89e3\u5176\u76ee\u7684\u662f\u4e3a\u4e86\u628a&nbsp;<code>[0, 1024]<\/code>&nbsp;\u7684\u7a7a\u95f4\u8303\u56f4\u5982\u4f55\u8f83\u597d\u7684\u538b\u7f29\u6620\u5c04\u5230&nbsp;<code>[0, 255]<\/code>&nbsp;\u7684\u7a7a\u95f4\u8303\u56f4\u3002hable \u662f tonemap \u7684\u4e00\u79cd\u7b97\u6cd5\uff0c\u5176\u4ed6\u7b97\u6cd5\u8fd8\u6709\u4e0a\u9762\u8d34\u51fa\u6765\u7684 reinhard\u3001mobius\u3002\u66f4\u591a\u7684\u7b97\u6cd5\u53ef\u4ee5\u53c2\u8003\uff1aTone mapping \u8fdb\u5316\u8bba&nbsp;[9]\u3002<\/p>\n\n\n\n<p><strong>4\uff09\u7ebf\u6027\u7684\u6a21\u62df\u5149\u4fe1\u53f7\u7ecf\u8fc7 OETF \u8f6c\u6362\u4e3a\u975e\u7ebf\u6027\u989c\u8272\u6570\u5b57\u4fe1\u53f7\u3002<\/strong><\/p>\n\n\n\n<p>\u505a\u5b8c ToneMapping \u540e\uff0c\u6211\u4eec\u5c31\u5f97\u5230\u4e86\u7b26\u5408 SDR \u6570\u636e\u8303\u56f4\u7684\u7ebf\u6027\u6a21\u62df\u5149\u4fe1\u53f7\u3002\u63a5\u4e0b\u6765\u6211\u4eec\u518d\u5c06\u5176\u8f6c\u6362\u4e3a\u989c\u8272\u6570\u5b57\u4fe1\u53f7\u3002\u4e0d\u8fc7\uff0c\u56e0\u4e3a\u662f SDR\uff0c\u8fd9\u91cc\u8981\u4f7f\u7528\u7684 OETF \u662f BT.709\u3002<\/p>\n\n\n\n<p>\u8fd9\u4e2a\u6b65\u9aa4\u5bf9\u5e94\u7684\u547d\u4ee4\u53c2\u6570\uff1a<code>zscale=t=bt709:m=bt709:r=tv<\/code>\uff0c\u8868\u793a\u4f7f\u7528\u7684 OETF \u8f6c\u6362\u51fd\u6570\u4e3a bt709\uff0c\u8f6c\u6362\u77e9\u9635\u4e5f\u662f bt709\uff0cYUV \u7684 range \u4e3a tv.limited\u3002<\/p>\n\n\n\n<p>\u4ee3\u7801\u8c03\u7528\u6d41\u7a0b\u548c\u7b2c\u4e00\u6b65\u7c7b\u4f3c\uff0c\u8fd9\u91cc\u53ea\u8d34\u4e00\u4e0b\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<div class=\"codecopy-container\">\n                <div class=\"codecopy-header\">\n                    \n                    <button class=\"codecopy-btn\" data-target=\"codecopy-69f8c252f3289\" title=\"Copy code to clipboard\">\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                <\/svg>\n                <span class=\"codecopy-text\">Copy<\/span>\n            <\/button>\n                <\/div>\n                <pre class=\"line-numbers\" id=\"codecopy-69f8c252f3289\"><code class=\"language-text\"><code>get_neighboring_colorspaces \u00a0\u00a0\u00a0\u00a0->\u00a0reate_linear_to_gamma_operation \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0->\u00a0create_gamma_operation \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0->\u00a0select_transfer_function \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0case\u00a0TransferCharacteristics::REC_709: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0func.to_gamma\u00a0=\u00a0scene_referred\u00a0?\u00a0rec_709_oetf\u00a0:\u00a0rec_1886_inverse_eotf; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break;<\/code><\/code><\/pre>\n            <\/div>\n\n\n\n<p><code>\u00a0\u00a0<\/code><\/p>\n\n\n\n<p>\u6700\u540e\u5bf9\u5e94\u7684\u8f6c\u6362\u51fd\u6570\u4e3a&nbsp;<code>rec_709_oetf<\/code>\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>ini<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>\/\/&nbsp;src\/zimg\/colorspace\/gamma.cpp constexpr&nbsp;float&nbsp;REC709_ALPHA&nbsp;=&nbsp;1.09929682680944f; constexpr&nbsp;float&nbsp;REC709_BETA&nbsp;=&nbsp;0.018053968510807f; float&nbsp;rec_709_oetf(float&nbsp;x)&nbsp;noexcept { &nbsp;&nbsp;x&nbsp;=&nbsp;std::max(x,&nbsp;0.0f); &nbsp; &nbsp;&nbsp;if&nbsp;(x&nbsp;&lt;&nbsp;REC709_BETA) &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;x&nbsp;*&nbsp;4.5f; &nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;REC709_ALPHA&nbsp;*&nbsp;zimg_x_powf(x,&nbsp;0.45f)&nbsp;-&nbsp;(REC709_ALPHA&nbsp;-&nbsp;1.0f); &nbsp; &nbsp;&nbsp;return&nbsp;x; }<\/code><\/p>\n\n\n\n<p>\u53c2\u8003\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4eff\u7167 FFmpeg \u5728 GLSL \u4e2d\u5904\u7406 HDR.ToneMapping[10]<\/li>\n\n\n\n<li>HDR in Android[11]<\/li>\n\n\n\n<li>HDR \u7247\u6e90\u538b\u5236\u6210 BT.709 \u8272\u5f69\u7a7a\u95f4\u7684 SDR \u89c6\u9891[12]<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.2\u3001\u4f7f\u7528 FFmpeg \u8f6f\u89e3 + OpenGL \u5b9e\u73b0\u8f6c\u6362<\/h3>\n\n\n\n<p>\u4e0a\u9762\u8bb2\u4e86\u4f7f\u7528 FFmpeg filter \u5b8c\u6210\u8f6c\u6362\u7684\u65b9\u6848\uff0c\u8fd9\u91cc\u6709\u4e24\u4e2a\u95ee\u9898\uff1a\u4e00\u4e2a\u662f FFmpeg \u8f6f\u89e3\u6027\u80fd\u7684\u95ee\u9898\uff0c\u53e6\u5916\u4e00\u4e2a\u662f\u4f7f\u7528 CPU \u505a filter \u6027\u80fd\u7684\u95ee\u9898\u3002\u6211\u4eec\u8fd9\u91cc\u5148\u89e3\u51b3\u4e00\u4e0b\u7528 CPU \u505a filter \u7684\u6027\u80fd\u95ee\u9898\uff1a\u5c06 EOTF\u3001\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3001ToneMapping\u3001OETF \u4f7f\u7528 OpenGL \u5b9e\u73b0\uff0c\u4ece\u800c\u5c06\u8fd9\u4e9b\u64cd\u4f5c\u7528 GPU \u6765\u5b8c\u6210\u3002\u540c\u65f6\u8fd9\u91cc\u6211\u4eec\u4e5f\u53ef\u4ee5\u540c\u65f6\u652f\u6301 PQ \u548c HLG \u6807\u51c6\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cFFmpeg \u8f6f\u89e3\u5b9e\u73b0\u4e2d\u89e3\u7801\u51fa\u6765\u7684\u6570\u636e\u683c\u5f0f\u4e00\u822c\u4e3a&nbsp;<code>AV_PIX_FMT_YUV420P10LE<\/code>\uff0c\u5c0f\u7aef\u5e8f\uff0c\u4f4e 10 \u4f4d\u6709\u6548\uff0c\u9ad8 6 \u4f4d\u5747\u4e3a 0\uff0c\u6240\u4ee5\u53ef\u4ee5\u76f4\u63a5\u88ab OpenGL \u8bfb\u53d6\uff0c\u4e0d\u9700\u8981\u505a\u79fb\u4f4d\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8981\u628a\u8fd9\u6837\u7684 YUV 10bit \u7684\u6570\u636e\u8f6c\u4e3a Texture \u7eb9\u7406\u5219\u9700\u8981\u505a\u4e00\u4e0b\u517c\u5bb9\u5904\u7406\uff0c\u4f7f\u7528 16bit \u7684\u6570\u636e\u7ed3\u6784\u6765\u5b58\u50a8 YUV 10bit\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"112\" src=\"\/blog\/wp-content\/uploads\/2023\/10\/image-18.png\" alt=\"\" class=\"wp-image-1314\" srcset=\"https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-18.png 640w, https:\/\/infernews.com\/blog\/wp-content\/uploads\/2023\/10\/image-18-300x53.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>YUV 10bit<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u5c06 EOTF\u3001\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3001ToneMapping\u3001OETF \u6d41\u7a0b\u7528 OpenGL ES Fragment Shader \u5b9e\u73b0\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<p>scss<\/p>\n\n\n\n<p>\u590d\u5236\u4ee3\u7801<code>precision&nbsp;highp&nbsp;float; uniform&nbsp;sampler2D&nbsp;inputImageTexture; uniform&nbsp;mediump&nbsp;mat3&nbsp;colorConversionMatrix; uniform&nbsp;mediump&nbsp;int&nbsp;isSt2084; uniform&nbsp;mediump&nbsp;int&nbsp;isAribB67; varying&nbsp;highp&nbsp;vec2&nbsp;textureCoordinate; #define&nbsp;FFMAX(a,b)&nbsp;((a)&nbsp;&gt;&nbsp;(b)&nbsp;?&nbsp;(a)&nbsp;:&nbsp;(b)) #define&nbsp;FFMAX3(a,b,c)&nbsp;FFMAX(FFMAX(a,b),c) highp&nbsp;vec3&nbsp;YuvConvertRGB_BT2020(highp&nbsp;vec3&nbsp;yuv,&nbsp;int&nbsp;normalize)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;vec3&nbsp;rgb; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;[64,&nbsp;960] &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;r&nbsp;=&nbsp;float(yuv.x&nbsp;-&nbsp;64.)&nbsp;*&nbsp;1.164384&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;float(yuv.z&nbsp;-&nbsp;512.)&nbsp;*&nbsp;-1.67867; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;g&nbsp;=&nbsp;float(yuv.x&nbsp;-&nbsp;64.)&nbsp;*&nbsp;1.164384&nbsp;-&nbsp;float(yuv.y&nbsp;-&nbsp;512.)&nbsp;*&nbsp;0.187326&nbsp;-&nbsp;float(yuv.z&nbsp;-&nbsp;512.)&nbsp;*&nbsp;0.65042; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;b&nbsp;=&nbsp;float(yuv.x&nbsp;-&nbsp;64.)&nbsp;*&nbsp;1.164384&nbsp;-&nbsp;float(yuv.y&nbsp;-&nbsp;512.)&nbsp;*&nbsp;-2.14177; &nbsp;&nbsp;&nbsp;&nbsp;rgb.r&nbsp;=&nbsp;r; &nbsp;&nbsp;&nbsp;&nbsp;rgb.g&nbsp;=&nbsp;g; &nbsp;&nbsp;&nbsp;&nbsp;rgb.b&nbsp;=&nbsp;b; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(normalize&nbsp;==&nbsp;1)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rgb&nbsp;\/=&nbsp;1024.0;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rgb; } \/\/&nbsp;[arib&nbsp;b67&nbsp;eotf const&nbsp;highp&nbsp;float&nbsp;ARIB_B67_A&nbsp;=&nbsp;0.17883277; const&nbsp;highp&nbsp;float&nbsp;ARIB_B67_B&nbsp;=&nbsp;0.28466892; const&nbsp;highp&nbsp;float&nbsp;ARIB_B67_C&nbsp;=&nbsp;0.55991073; highp&nbsp;float&nbsp;arib_b67_inverse_oetf(highp&nbsp;float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;Prevent&nbsp;negative&nbsp;pixels&nbsp;expanding&nbsp;into&nbsp;positive&nbsp;values. &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;max(x,&nbsp;0.0); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(x&nbsp;&lt;=&nbsp;0.5) &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;(x&nbsp;*&nbsp;x)&nbsp;*&nbsp;(1.0&nbsp;\/&nbsp;3.0); &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;(exp((x&nbsp;-&nbsp;ARIB_B67_C)&nbsp;\/&nbsp;ARIB_B67_A)&nbsp;+&nbsp;ARIB_B67_B)&nbsp;\/&nbsp;12.0; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x; } highp&nbsp;float&nbsp;ootf_1_2(highp&nbsp;float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x&nbsp;&lt;&nbsp;0.0&nbsp;?&nbsp;x&nbsp;:&nbsp;pow(x,&nbsp;1.2); } highp&nbsp;float&nbsp;arib_b67_eotf(highp&nbsp;float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ootf_1_2(arib_b67_inverse_oetf(x)); } \/\/&nbsp;arib&nbsp;b67&nbsp;eotf] \/\/&nbsp;[st&nbsp;2084&nbsp;eotf highp&nbsp;float&nbsp;ST2084_M1&nbsp;=&nbsp;0.1593017578125; const&nbsp;float&nbsp;ST2084_M2&nbsp;=&nbsp;78.84375; const&nbsp;float&nbsp;ST2084_C1&nbsp;=&nbsp;0.8359375; const&nbsp;float&nbsp;ST2084_C2&nbsp;=&nbsp;18.8515625; const&nbsp;float&nbsp;ST2084_C3&nbsp;=&nbsp;18.6875; highp&nbsp;float&nbsp;FLT_MIN&nbsp;=&nbsp;1.17549435082228750797e-38; highp&nbsp;float&nbsp;st_2084_eotf(highp&nbsp;float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;xpow&nbsp;=&nbsp;pow(x,&nbsp;float(1.0&nbsp;\/&nbsp;ST2084_M2)); &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;num&nbsp;=&nbsp;max(xpow&nbsp;-&nbsp;ST2084_C1,&nbsp;0.0); &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;den&nbsp;=&nbsp;max(ST2084_C2&nbsp;-&nbsp;ST2084_C3&nbsp;*&nbsp;xpow,&nbsp;FLT_MIN); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pow(num\/den,&nbsp;1.0&nbsp;\/&nbsp;ST2084_M1); } \/\/&nbsp;st&nbsp;2084&nbsp;eotf] \/\/&nbsp;[tonemap&nbsp;hable highp&nbsp;float&nbsp;hableF(highp&nbsp;float&nbsp;inVal) { &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;a&nbsp;=&nbsp;0.15,&nbsp;b&nbsp;=&nbsp;0.50,&nbsp;c&nbsp;=&nbsp;0.10,&nbsp;d&nbsp;=&nbsp;0.20,&nbsp;e&nbsp;=&nbsp;0.02,&nbsp;f&nbsp;=&nbsp;0.30; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(inVal&nbsp;*&nbsp;(inVal&nbsp;*&nbsp;a&nbsp;+&nbsp;b&nbsp;*&nbsp;c)&nbsp;+&nbsp;d&nbsp;*&nbsp;e)&nbsp;\/&nbsp;(inVal&nbsp;*&nbsp;(inVal&nbsp;*&nbsp;a&nbsp;+&nbsp;b)&nbsp;+&nbsp;d&nbsp;*&nbsp;f)&nbsp;-&nbsp;e&nbsp;\/&nbsp;f; } \/\/&nbsp;tonemap&nbsp;hable] \/\/&nbsp;[bt709&nbsp; highp&nbsp;float&nbsp;rec_1886_inverse_eotf(highp&nbsp;float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x&nbsp;&lt;&nbsp;0.0&nbsp;?&nbsp;0.0&nbsp;:&nbsp;pow(x,&nbsp;1.0&nbsp;\/&nbsp;2.4); } highp&nbsp;float&nbsp;rec_1886_eotf(float&nbsp;x) { &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x&nbsp;&lt;&nbsp;0.0&nbsp;?&nbsp;0.0&nbsp;:&nbsp;pow(x,&nbsp;2.4); } \/\/&nbsp;bt709] void&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;vec3&nbsp;rgb10bit&nbsp;=&nbsp;texture2D(inputImageTexture,&nbsp;textureCoordinate).rgb; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;1\u3001HDR&nbsp;\u975e\u7ebf\u6027\u7535\u4fe1\u53f7\u8f6c\u4e3a&nbsp;HDR&nbsp;\u7ebf\u6027\u5149\u4fe1\u53f7\uff08EOTF\uff09 &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;peak_luminance&nbsp;=&nbsp;100.0; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;ST2084_PEAK_LUMINANCE&nbsp;=&nbsp;10000.0; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;to_linear_scale; &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;vec3&nbsp;fragColor; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isSt2084&nbsp;==&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_linear_scale&nbsp;=&nbsp;10000.0&nbsp;\/&nbsp;peak_luminance; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;=&nbsp;to_linear_scale&nbsp;*&nbsp;vec3(st_2084_eotf(rgb10bit.r),&nbsp;st_2084_eotf(rgb10bit.g),&nbsp;st_2084_eotf(rgb10bit.b)); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(isAribB67&nbsp;==&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_linear_scale&nbsp;=&nbsp;1000.0&nbsp;\/&nbsp;peak_luminance; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;=&nbsp;to_linear_scale&nbsp;*&nbsp;vec3(arib_b67_eotf(rgb10bit.r),&nbsp;arib_b67_eotf(rgb10bit.g),&nbsp;arib_b67_eotf(rgb10bit.b)); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;=&nbsp;vec3(rec_1886_eotf(rgb10bit.r),&nbsp;rec_1886_eotf(rgb10bit.g),&nbsp;rec_1886_eotf(rgb10bit.b)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;2\u3001HDR&nbsp;\u7ebf\u6027\u5149\u4fe1\u53f7\u505a\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\uff08Color&nbsp;Space&nbsp;Converting\uff09 &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;color-primaries&nbsp;REC_2020&nbsp;to&nbsp;REC_709 &nbsp;&nbsp;&nbsp;&nbsp;mat3&nbsp;rgb2xyz2020&nbsp;=&nbsp;mat3(0.6370,&nbsp;0.1446,&nbsp;0.1689, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.2627,&nbsp;0.6780,&nbsp;0.0593, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0000,&nbsp;0.0281,&nbsp;1.0610); &nbsp;&nbsp;&nbsp;&nbsp;mat3&nbsp;xyz2rgb709&nbsp;=&nbsp;mat3(3.2410,&nbsp;-1.5374,&nbsp;-0.4986, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-0.9692,&nbsp;1.8760,&nbsp;0.0416, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0556,&nbsp;-0.2040,&nbsp;1.0570);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;*=&nbsp;rgb2xyz2020&nbsp;*&nbsp;xyz2rgb709; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;3\u3001HDR&nbsp;\u7ebf\u6027\u5149\u4fe1\u53f7\u8272\u8c03\u6620\u5c04\u4e3a&nbsp;SDR&nbsp;\u7ebf\u6027\u5149\u4fe1\u53f7\uff08Tone&nbsp;Mapping\uff09 &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;sig&nbsp;=&nbsp;FFMAX(FFMAX3(fragColor.r,&nbsp;fragColor.g,&nbsp;fragColor.b),&nbsp;1e-6); &nbsp;&nbsp;&nbsp;&nbsp;highp&nbsp;float&nbsp;sig_orig&nbsp;=&nbsp;sig; &nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;peak&nbsp;=&nbsp;10.0; &nbsp;&nbsp;&nbsp;&nbsp;sig&nbsp;=&nbsp;hableF(sig)&nbsp;\/&nbsp;hableF(peak); &nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;*=&nbsp;sig&nbsp;\/&nbsp;sig_orig; &nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;4\u3001SDR&nbsp;\u7ebf\u6027\u5149\u4fe1\u53f7\u8f6c&nbsp;SDR&nbsp;\u975e\u7ebf\u6027\u7535\u4fe1\u53f7\uff08OETF\uff09 &nbsp;&nbsp;&nbsp;&nbsp;fragColor&nbsp;=&nbsp;vec3(rec_1886_inverse_eotf(fragColor.r),&nbsp;rec_1886_inverse_eotf(fragColor.g),&nbsp;rec_1886_inverse_eotf(fragColor.b)); &nbsp;&nbsp;&nbsp;&nbsp;gl_FragColor&nbsp;=&nbsp;vec4(fragColor,&nbsp;1.0); }<\/code><\/p>\n\n\n\n<p>\u5230\u8fd9\u91cc\uff0c\u6211\u4eec\u5c31\u628a\u672c\u6765\u4f7f\u7528 FFmpeg&nbsp;<code>zscale<\/code>&nbsp;\u548c&nbsp;<code>tonemap<\/code>&nbsp;\u4e24\u4e2a Filter \u7684\u903b\u8f91\u5c31\u8fc1\u79fb\u4e3a OpenGL \u5b9e\u73b0\u4e86\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.3\u3001\u4f7f\u7528 Android \u786c\u89e3 + OpenGL \u5b9e\u73b0\u8f6c\u6362<\/h3>\n\n\n\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u63a5\u7740\u89e3\u51b3 FFmpeg \u8f6f\u89e3\u7684\u6027\u80fd\u95ee\u9898\uff0c\u5728\u786c\u89e3\u652f\u6301\u8f83\u597d\u7684\u673a\u578b\u4e0a\u4f7f\u7528\u786c\u89e3\u6765\u5b9e\u73b0\u3002Android \u786c\u89e3\u53ef\u4ee5\u5c06\u89c6\u9891\u89e3\u7801\u4e3a Texture \u7eb9\u7406\uff0c\u6240\u4ee5\u76f8\u5bf9\u4e8e\u8f6f\u89e3\u53ea\u8981\u5b9e\u73b0\u4ece\u7eb9\u7406\u4e2d\u8bfb\u51fa YUV10bit \u6570\u636e\uff0c\u7136\u540e\u5b8c\u6210\u540e\u7eed\u7684\uff1aEOTF\u3001\u989c\u8272\u7a7a\u95f4\u8f6c\u6362\u3001ToneMapping\u3001OETF\u8fc7\u7a0b\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0 HDR \u8f6c SDR \u4e86\u3002<\/p>\n\n\n\n<p>\u5b9e\u73b0\u8fd9\u4e2a\u8fc7\u7a0b\u7684 OpenGL ES Fragment Shader \u4ee3\u7801\u548c\u4e0a\u4e00\u8282\u4e2d\u4e00\u6837\u5373\u53ef\uff0c\u8fd9\u91cc\u5c31\u4e0d\u518d\u91cd\u590d\u4e86\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u53c2\u8003\u8d44\u6599<\/h3>\n\n\n\n<p>[1]&nbsp;<\/p>\n\n\n\n<p>Standard-dynamic-range video:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FStandard-dynamic-range_video\" target=\"_blank\" rel=\"noreferrer noopener\">en.wikipedia.org\/wiki\/Standa\u2026<\/a><\/em><\/p>\n\n\n\n<p>[2]&nbsp;<\/p>\n\n\n\n<p>High-dynamic-range:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHigh-dynamic-range_television\" target=\"_blank\" rel=\"noreferrer noopener\">en.wikipedia.org\/wiki\/High-d\u2026<\/a><\/em><\/p>\n\n\n\n<p>[3]&nbsp;<\/p>\n\n\n\n<p>HDR \u6280\u672f\u8d8b\u52bf\u6d45\u6790:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU1NTEzOTM5Mw%3D%3D%26mid%3D2247521774%26idx%3D1%26sn%3Dd2b1a7a705e742c65697760f7641ec9b%26scene%3D21%23wechat_redirect\" target=\"_blank\" rel=\"noreferrer noopener\">mp.weixin.qq.com\/s?__biz=MzU\u2026<\/a><\/em><\/p>\n\n\n\n<p>[4]&nbsp;<\/p>\n\n\n\n<p>zimg:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsekrit-twc%2Fzimg\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/sekrit-twc\/\u2026<\/a><\/em><\/p>\n\n\n\n<p>[5]&nbsp;<\/p>\n\n\n\n<p>zimg:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsekrit-twc%2Fzimg\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/sekrit-twc\/\u2026<\/a><\/em><\/p>\n\n\n\n<p>[6]&nbsp;<\/p>\n\n\n\n<p>zimg:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsekrit-twc%2Fzimg\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/sekrit-twc\/\u2026<\/a><\/em><\/p>\n\n\n\n<p>[7]&nbsp;<\/p>\n\n\n\n<p>FFmpeg:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2FFFmpeg%2FFFmpeg\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/FFmpeg\/FFmp\u2026<\/a><\/em><\/p>\n\n\n\n<p>[8]&nbsp;<\/p>\n\n\n\n<p>vf_tonemap.c:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fgithub.com%2FFFmpeg%2FFFmpeg%2Fblob%2Fmaster%2Flibavfilter%2Fvf_tonemap.c\" target=\"_blank\" rel=\"noreferrer noopener\">github.com\/FFmpeg\/FFmp\u2026<\/a><\/em><\/p>\n\n\n\n<p>[9]&nbsp;<\/p>\n\n\n\n<p>Tone mapping \u8fdb\u5316\u8bba:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F21983679\" target=\"_blank\" rel=\"noreferrer noopener\">zhuanlan.zhihu.com\/p\/21983679<\/a><\/em><\/p>\n\n\n\n<p>[10]&nbsp;<\/p>\n\n\n\n<p>\u4eff\u7167 FFmpeg \u5728 GLSL \u4e2d\u5904\u7406 HDR.ToneMapping:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fa360940265a%2Farticle%2Fdetails%2F124457544\" target=\"_blank\" rel=\"noreferrer noopener\">blog.csdn.net\/a360940265a\u2026<\/a><\/em><\/p>\n\n\n\n<p>[11]&nbsp;<\/p>\n\n\n\n<p>HDR in Android:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fa360940265a%2Fcategory_11625435.html\" target=\"_blank\" rel=\"noreferrer noopener\">blog.csdn.net\/a360940265a\u2026<\/a><\/em><\/p>\n\n\n\n<p>[12]&nbsp;<\/p>\n\n\n\n<p>HDR \u7247\u6e90\u538b\u5236\u6210 BT.709 \u8272\u5f69\u7a7a\u95f4\u7684 SDR \u89c6\u9891:&nbsp;<em><a href=\"https:\/\/link.juejin.cn?target=https%3A%2F%2Fwww.bilibili.com%2Fread%2Fcv3936575\" target=\"_blank\" rel=\"noreferrer noopener\">www.bilibili.com\/read\/cv3936\u2026<\/a><\/em><\/p>\n\n\n\n<p>\u6807\u7b7e\uff1a<\/p>\n\n\n\n<p><a href=\"\/tag\/iOS\" target=\"_blank\" rel=\"noreferrer noopener\">iOS<\/a><a href=\"\/tag\/Android\" target=\"_blank\" rel=\"noreferrer noopener\">Android<\/a><a href=\"\/tag\/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91\" target=\"_blank\" rel=\"noreferrer noopener\">\u97f3\u89c6\u9891\u5f00\u53d1<\/a><\/p>\n\n\n\n<p>\u4f5c\u8005\uff1a\u5173\u952e\u5e27Keyframe<br><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\uff1ahttps:\/\/juejin.cn\/post\/7239187347355172921 1\u3001\u4ec0\u4e48\u662f SDR \u548c HDR\uff1f SDR\uff08Standard Dynamic Range\uff09\u5373\u6807\u51c6\u52a8\u6001\u8303\u56f4\uff0c\u662f\u4e00\u79cd\u57fa\u4e8e\u4eae\u5ea6\u3001\u5bf9\u6bd4\u5ea6\u3001\u989c\u8272\u7279\u6027\uff0c\u4ee5\u53ca CRT \u663e\u793a\u5668\u7684\u5c40\u9650\u6027\u6765\u5c55\u793a\u89c6\u9891\u7684\u6280\u672f\u3002\u8fd9\u91cc\u8bf4\u7684\u52a8\u6001\u8303\u56f4\u4e00\u822c\u662f\u6307\u4eae\u5ea6\u8303\u56f4\uff0c\u66f4\u5927\u7684\u4eae\u5ea6\u8303\u56f4\u53ef\u4ee5\u652f\u6301\u66f4\u9ad8\u7684\u5bf9\u6bd4\u5ea6\u3002SDR \u7684\u652f\u6301\u7684\u4eae\u5ea6\u8303\u56f4\u5728 0.1nit \u5230 100nit \u4e4b\u95f4\uff0c\u4f7f\u7528 Rec.709\/sRGB \u8272\u57df\uff0c\u5e76\u4f7f\u7528 Gamma \u66f2\u7ebf\u6765\u4f5c\u4e3a\u5b83\u7684\u7535\u5149\u8f6c\u6362\u51fd\u6570\uff08Electro-Optical Transfer Function\uff0cEOTF\uff09\u3002 HDR\uff08High Dynamic Range\uff09\u5373\u9ad8\u52a8\u6001\u8303\u56f4\uff0c\u662f\u5bf9 SDR \u7684\u5347\u7ea7\uff0c\u662f\u4e00\u79cd\u63d0\u5347\u89c6\u9891\u663e\u793a\u8d28\u91cf\u7684\u6280\u672f\u3002HDR \u6539\u53d8\u4e86\u89c6\u9891\u548c\u56fe\u50cf\u7684\u4eae\u5ea6\u548c\u989c\u8272\u4fe1\u606f\u5728\u4fe1\u53f7\u4e2d\u7684\u8868\u793a\u65b9\u5f0f\uff0c\u4ece\u800c\u652f\u6301\u66f4\u5927\u7684\u4eae\u5ea6\u8303\u56f4\uff080.0005-10000nit\uff09 \u3001\u66f4\u5bbd\u5e7f\u7684\u8272\u57df\uff08BT.2020\uff09 \u3001\u66f4\u9ad8\u7cbe\u5ea6\u7684\u91cf\u5316\uff0810bit \u6216 12bit\uff09 \u3002\u56e0\u6b64 HDR \u89c6\u9891\u753b\u9762\u53ef\u4ee5\u5c55\u73b0\u51fa\u66f4\u591a\u7684\u4eae\u90e8\u548c\u6697\u90e8\u7ec6\u8282\uff0c\u753b\u9762\u62e5\u6709\u4e30\u5bcc\u7684\u8272\u5f69\u548c\u751f\u52a8\u81ea\u7136\u7684\u7ec6\u8282\u8868\u73b0\uff0c\u56e0\u6b64\u753b\u9762\u66f4\u63a5\u8fd1\u4eba\u773c\u6240\u89c1\uff1bSDR \u89c6\u9891\u7684\u8272\u5f69\u9971\u548c\u5ea6\u4ee5\u53ca\u753b\u9762\u5bf9\u6bd4\u5ea6\u5219\u4e0d\u5982 HDR \u89c6\u9891\uff0c\u76f8\u6bd4 HDR \u89c6\u9891\uff0cSDR \u89c6\u9891\u7684\u753b\u9762\uff0c\u7ed9\u4eba\u4e00\u79cd\u6697\u6de1\u4e0d\u81ea\u7136\u7684\u89c2\u611f\uff0c\u540c\u65f6\u5728\u4eae\u90e8\u4ee5\u53ca\u6697\u90e8\u7ec6\u8282\u4e0a\u90fd\u6709\u5f88\u660e\u663e\u7684\u7f3a\u5931\u3002 HDR \u548c SDR \u7684\u89c6\u89c9\u5dee\u5f02 HDR \u548c SDR \u4fe1\u606f\u5904\u7406\u533a\u522b HDR \u6280\u672f\u6709\u7740\u4e0d\u540c\u7684\u6807\u51c6\uff0c\u5176\u4e2d\u5e38\u89c1\u7684\u6709\u56db\u4e2a\uff1aHDR10\u3001HDR10+\u3001Dolby Vision\u3001HLG\u3002 \u4e0b\u9762\u4e0d\u540c\u683c\u5f0f HDR \u7684\u53c2\u6570\u5bf9\u6bd4\uff1a \u4e0d\u540c\u683c\u5f0f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"googlesitekit_rrm_CAowvqSiDA:productID":"","footnotes":""},"class_list":["post-1301","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/pages\/1301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/comments?post=1301"}],"version-history":[{"count":0,"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/pages\/1301\/revisions"}],"wp:attachment":[{"href":"https:\/\/infernews.com\/blog\/wp-json\/wp\/v2\/media?parent=1301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}