{"id":1683,"date":"2024-12-17T14:51:26","date_gmt":"2024-12-17T05:51:26","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1683"},"modified":"2025-03-24T08:50:09","modified_gmt":"2025-03-23T23:50:09","slug":"c-bitmap%e3%82%af%e3%83%a9%e3%82%b9%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e3%83%a1%e3%83%a2%e3%83%aa%e5%8a%b9%e7%8e%87%e3%82%92%e6%9c%80%e5%a4%a7%e5%8c%96%e3%81%99%e3%82%8b7%e3%81%a4","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1683","title":{"rendered":"C# Bitmap\u30af\u30e9\u30b9\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u30e1\u30e2\u30ea\u52b9\u7387\u3092\u6700\u5927\u5316\u3059\u308b7\u3064\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">\u306f\u3058\u3081\u306b<\/a>  <\/li>  <li>    <a href=\"#i-1\">Bitmap\u30af\u30e9\u30b9\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-2\">System.Drawing.Bitmap\u30af\u30e9\u30b9\u306e\u7279\u5fb4\u3068\u6a5f\u80fd<\/a>      <\/li>      <li>        <a href=\"#i-5\">Bitmap\u30c7\u30fc\u30bf\u3092\u30e1\u30e2\u30ea\u4e0a\u3067\u6271\u3046\u4ed5\u7d44\u307f<\/a>      <\/li>      <li>        <a href=\"#i-6\">.NET 6\u4ee5\u964d\u3067\u306e\u63a8\u5968\u3055\u308c\u308b\u4f7f\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3068\u63a8\u5968\u3055\u308c\u308b\u5b9f\u88c5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-14\">Bitmap\u306e\u52b9\u7387\u7684\u306a\u4f5c\u6210\u3068\u8aad\u307f\u8fbc\u307f<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-15\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u305fBitmap\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u4f7f\u7528\u3057\u305f\u5927\u5bb9\u91cf\u753b\u50cf\u306e\u52b9\u7387\u7684\u306a\u8aad\u307f\u8fbc\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u753b\u50cf\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5225\u306e\u6700\u9069\u306a\u8aad\u307f\u8fbc\u307f\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3092\u9632\u3050Bitmap\u64cd\u4f5c\u306e\u5b9f\u8df5\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">using\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u9069\u5207\u306a\u30ea\u30bd\u30fc\u30b9\u89e3\u653e<\/a>      <\/li>      <li>        <a href=\"#i-21\">Dispose()\u30e1\u30bd\u30c3\u30c9\u306e\u6b63\u3057\u3044\u547c\u3073\u51fa\u3057\u30bf\u30a4\u30df\u30f3\u30b0<\/a>      <\/li>      <li>        <a href=\"#i-22\">GC\u306b\u983c\u3089\u306a\u3044\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-24\">\u9ad8\u901f\u306a\u753b\u50cf\u51e6\u7406\u3092\u5b9f\u73fe\u3059\u308bBitmap\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u3078\u306e\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/a>      <\/li>      <li>        <a href=\"#i-27\">\u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/a>      <\/li>      <li>        <a href=\"#i-28\">unsafe context\u3092\u4f7f\u7528\u3057\u305f\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-29\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-30\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306eBitmap\u5b9f\u88c5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-31\">System.Drawing.Common\u306e\u5236\u9650\u4e8b\u9805\u3068\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-32\">\u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30eaImageSharp\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-33\">\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5225\u306e\u6700\u9069\u5316\u6226\u7565<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-35\">Bitmap\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-36\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-37\">\u753b\u50cf\u51e6\u7406\u901f\u5ea6\u306e\u6e2c\u5b9a\u3068\u6700\u9069\u5316<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-40\">\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-42\">\u5b9f\u8df5\u7684\u306aBitmap\u6d3b\u7528\u30b7\u30ca\u30ea\u30aa<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-43\">\u5927\u91cf\u306e\u753b\u50cf\u3092\u6271\u3046\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5<\/a>      <\/li>      <li>        <a href=\"#i-44\">Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306eBitmap\u51e6\u7406<\/a>      <\/li>      <li>        <a href=\"#i-45\">\u753b\u50cf\u5909\u63db\u51e6\u7406\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-46\">\u5b9f\u8df5\u7684\u306a\u30b7\u30ca\u30ea\u30aa\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-47\">Bitmap\u30af\u30e9\u30b9\u306e\u307e\u3068\u3081<\/a>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">\u306f\u3058\u3081\u306b<\/h2>\n\n\n\n<p>C#\u3067\u306eBitmap\u51e6\u7406\u306f\u753b\u50cf\u51e6\u7406\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u304c\u3001\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3084\u6027\u80fd\u306e\u554f\u984c\u306b\u60a9\u307e\u3055\u308c\u308b\u3053\u3068\u304c\u5c11\u306a\u304f\u3042\u308a\u307e\u305b\u3093\u3002<br>\u672c\u8a18\u4e8b\u3067\u306f\u3001C# Bitmap\u30af\u30e9\u30b9\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3068\u3001\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u672c\u8a18\u4e8b\u3067\u5b66\u3079\u308b\u3053\u3068<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-idea-alt\">Bitmap\u30af\u30e9\u30b9\u306e\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3068\u5185\u90e8\u69cb\u9020<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u30e1\u30e2\u30ea\u52b9\u7387\u3092\u8003\u616e\u3057\u305fBitmap\u306e\u4f5c\u6210\u3068\u64cd\u4f5c\u624b\u6cd5<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u30de\u30eb\u30c1\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u305f\u3081\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u753b\u50cf\u51e6\u7406\u306e\u9ad8\u901f\u5316\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u6226\u7565<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u30d0\u30c3\u30c1\u51e6\u7406\u3084Web\u958b\u767a\u3067\u306e\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-idea-alt\">\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3092\u9632\u3050\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-1\">Bitmap\u30af\u30e9\u30b9\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">System.Drawing.Bitmap\u30af\u30e9\u30b9\u306e\u7279\u5fb4\u3068\u6a5f\u80fd<\/h3>\n\n\n\n<p>System.Drawing.Bitmap\u30af\u30e9\u30b9\u306f\u3001.NET\u74b0\u5883\u3067\u30e9\u30b9\u30bf\u30fc\u753b\u50cf\uff08\u30d4\u30af\u30bb\u30eb\u30d9\u30fc\u30b9\u306e\u753b\u50cf\uff09\u3092\u64cd\u4f5c\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u30af\u30e9\u30b9\u3067\u3059\u3002<br>\u3053\u306e\u30af\u30e9\u30b9\u306f\u753b\u50cf\u306e\u4f5c\u6210\u3001\u8aad\u307f\u8fbc\u307f\u3001\u4fdd\u5b58\u3001\u7de8\u96c6\u306a\u3069\u3001\u69d8\u3005\u306a\u753b\u50cf\u51e6\u7406\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">\u4e3b\u306a\u7279\u5fb4<\/h4>\n\n\n\n<div class=\"wp-block-sgb-box sng-box box6\">\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>GDI+\u30d9\u30fc\u30b9\u306e\u9ad8\u30ec\u30d9\u30eb\u306a\u753b\u50cf\u64cd\u4f5cAPI<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u753b\u50cf\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30b5\u30dd\u30fc\u30c8\uff08BMP, JPEG, PNG, GIF\u7b49\uff09<\/li>\n\n\n\n<li>\u30d4\u30af\u30bb\u30eb\u5358\u4f4d\u3067\u306e\u753b\u50cf\u64cd\u4f5c\u6a5f\u80fd<\/li>\n\n\n\n<li>\u63cf\u753b\u6a5f\u80fd\u3068\u306e\u7d71\u5408\uff08Graphics \u30af\u30e9\u30b9\u3068\u306e\u9023\u643a\uff09<\/li>\n<\/ul>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">\u57fa\u672c\u7684\u306a\u4f7f\u7528\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.Drawing;\n\n\/\/ \u65b0\u3057\u3044Bitmap\u306e\u4f5c\u6210\nusing (Bitmap bmp = new Bitmap(800, 600))\n{\n    \/\/ \u753b\u50cf\u306e\u4fdd\u5b58\n    bmp.Save(\"example.png\", System.Drawing.Imaging.ImageFormat.Png);\n}\n\n\/\/ \u65e2\u5b58\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\nusing (Bitmap loadedBmp = new Bitmap(\"example.png\"))\n{\n    \/\/ \u753b\u50cf\u306e\u5e45\u3068\u9ad8\u3055\u306e\u53d6\u5f97\n    int width = loadedBmp.Width;\n    int height = loadedBmp.Height;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">Bitmap\u30c7\u30fc\u30bf\u3092\u30e1\u30e2\u30ea\u4e0a\u3067\u6271\u3046\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Bitmap\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u3001\u753b\u50cf\u30c7\u30fc\u30bf\u3092\u30e1\u30e2\u30ea\u4e0a\u3067\u3069\u306e\u3088\u3046\u306b\u4fdd\u6301\u3057\u3066\u3044\u308b\u306e\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u69cb\u9020\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u306f\u9023\u7d9a\u3057\u305f\u30d0\u30a4\u30c8\u914d\u5217\u3068\u3057\u3066\u4fdd\u6301<\/li>\n\n\n\n<li>\u5404\u30d4\u30af\u30bb\u30eb\u306f\u8272\u60c5\u5831\uff08RGB\uff09\u3068\u30a2\u30eb\u30d5\u30a1\u5024\u3092\u4fdd\u6301<\/li>\n\n\n\n<li>\u753b\u50cf\u306e\u5e45\u00d7\u9ad8\u3055\u00d7\u30d4\u30af\u30bb\u30eb\u3042\u305f\u308a\u306e\u30d3\u30c3\u30c8\u6570\u306e\u30e1\u30e2\u30ea\u3092\u4f7f\u7528<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u7279\u5fb4\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30a2\u30f3\u30de\u30cd\u30fc\u30b8\u30c9\u30ea\u30bd\u30fc\u30b9\u3092\u5185\u90e8\u3067\u4f7f\u7528<\/li>\n\n\n\n<li>IDisposable\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3092\u5b9f\u88c5<\/li>\n\n\n\n<li>GC\u5bfe\u8c61\u5916\u306e\u30e1\u30e2\u30ea\u9818\u57df\u3092\u4f7f\u7528<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">.NET 6\u4ee5\u964d\u3067\u306e\u63a8\u5968\u3055\u308c\u308b\u4f7f\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>.NET 6\u4ee5\u964d\u3067\u306f\u3001System.Drawing.Common\u306e\u4f7f\u7528\u306b\u95a2\u3057\u3066\u91cd\u8981\u306a\u5909\u66f4\u304c\u52a0\u3048\u3089\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">1. \u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ .NET 6\u4ee5\u964d\u3067\u306e\u63a8\u5968\u3055\u308c\u308b\u521d\u671f\u5316\u65b9\u6cd5\nusing var image = Image.FromFile(\"example.png\");\nusing var bitmap = new Bitmap(image);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-8\">2. \u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u691c\u8a0e<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ImageSharp\uff1a\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u65b0\u3057\u3044\u753b\u50cf\u51e6\u7406\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n\n\n\n<li>SkiaSharp\uff1a\u9ad8\u6027\u80fd\u306a2D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n\n\n\n<li>Magick.NET\uff1aImageMagick\u306e\u30e9\u30c3\u30d1\u30fc\u30e9\u30a4\u30d6\u30e9\u30ea<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-9\">3. \u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u6ce8\u610f\u70b9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u63a8\u5968\u3055\u308c\u308b\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u30d1\u30bf\u30fc\u30f3\nusing (var bitmap = new Bitmap(width, height))\n{\n    try\n    {\n        \/\/ \u753b\u50cf\u51e6\u7406\u64cd\u4f5c\n        bitmap.SetPixel(0, 0, Color.Red);\n    }\n    catch (Exception ex)\n    {\n        \/\/ \u30a8\u30e9\u30fc\u51e6\u7406\n        Console.WriteLine($\"\u753b\u50cf\u51e6\u7406\u30a8\u30e9\u30fc: {ex.Message}\");\n    }\n} \/\/ \u81ea\u52d5\u7684\u306bDispose()\u304c\u547c\u3070\u308c\u308b<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u4e00\u822c\u7684\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3068\u63a8\u5968\u3055\u308c\u308b\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">1. \u753b\u50cf\u306e\u4e00\u6642\u7684\u306a\u7de8\u96c6<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public static async Task&lt;bool&gt; QuickEditAsync(string path)\n{\n    try\n    {\n        using var bitmap = new Bitmap(path);\n        using var g = Graphics.FromImage(bitmap);\n\n        \/\/ \u7de8\u96c6\u64cd\u4f5c\n        g.DrawRectangle(Pens.Red, 10, 10, 100, 100);\n\n        await Task.Run(() =&gt; bitmap.Save(path));\n        return true;\n    }\n    catch (Exception ex)\n    {\n        \/\/ \u9069\u5207\u306a\u30a8\u30e9\u30fc\u30ed\u30b0\u8a18\u9332\n        Debug.WriteLine($\"\u753b\u50cf\u7de8\u96c6\u30a8\u30e9\u30fc: {ex.Message}\");\n        return false;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">2. \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BitmapMemoryMonitor\n{\n    private readonly long _memoryThreshold;\n\n    public BitmapMemoryMonitor(long memoryThresholdMB)\n    {\n        _memoryThreshold = memoryThresholdMB * 1024 * 1024;\n    }\n\n    public bool CanCreateBitmap(int width, int height, PixelFormat format)\n    {\n        var requiredMemory = CalculateMemoryUsage(width, height, format);\n        var availableMemory = GC.GetTotalMemory(false);\n\n        return (availableMemory + requiredMemory) &lt; _memoryThreshold;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">3. \u6027\u80fd\u306b\u95a2\u3059\u308b\u91cd\u8981\u306a\u6ce8\u610f\u70b9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76ee\u5b89\n\/\/ 32bit RGBA\u306e\u5834\u5408\uff1aWidth \u00d7 Height \u00d7 4 bytes\n\/\/ \u4f8b\uff1a1920x1080\u306e\u753b\u50cf\u306e\u5834\u5408\n\/\/ 1920 \u00d7 1080 \u00d7 4 = 8,294,400 bytes (\u7d047.9MB)\n\npublic static long CalculateMemoryUsage(int width, int height, PixelFormat format)\n{\n    int bytesPerPixel = Image.GetPixelFormatSize(format) \/ 8;\n    return width * height * bytesPerPixel;\n}<\/pre>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u91cd\u8981\u306a\u7559\u610f\u70b9<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<p class=\"is-style-sango-paragraph-memo-alt\">\u5e38\u306busing\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-memo-alt\">\u5927\u304d\u306a\u753b\u50cf\u3092\u6271\u3046\u5834\u5408\u306f\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306b\u6ce8\u610f<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-memo-alt\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u8981\u4ef6\u304c\u3042\u308b\u5834\u5408\u306f\u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u691c\u8a0e<\/p>\n\n\n\n<p class=\"is-style-sango-paragraph-memo-alt\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b<\/p>\n<\/div><\/div>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067\u3088\u304f\u906d\u9047\u3059\u308b\u8ab2\u984c\u306b\u5bfe\u3059\u308b\u89e3\u6c7a\u7b56\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-14\">Bitmap\u306e\u52b9\u7387\u7684\u306a\u4f5c\u6210\u3068\u8aad\u307f\u8fbc\u307f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6291\u3048\u305fBitmap\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316<\/h3>\n\n\n\n<p>Bitmap\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u52b9\u7387\u7684\u306a\u4f5c\u6210\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e1\u30e2\u30ea\u7ba1\u7406\u306b\u304a\u3044\u3066\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002<br>\u4ee5\u4e0b\u306b\u3001\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">\u9069\u5207\u306a\u30d4\u30af\u30bb\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u9078\u629e<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.Drawing;\nusing System.Drawing.Imaging;\n\n\/\/ 8\u30d3\u30c3\u30c8 \u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u753b\u50cf\u306e\u4f5c\u6210\npublic Bitmap CreateOptimizedBitmap(int width, int height)\n{\n    \/\/ \u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u7528\u306e\u30ab\u30e9\u30fc\u30d1\u30ec\u30c3\u30c8\u3092\u4f5c\u6210\n    ColorPalette palette;\n    using (var tempBmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed))\n    {\n        palette = tempBmp.Palette;\n        for (int i = 0; i &lt; 256; i++)\n        {\n            palette.Entries[i] = Color.FromArgb(i, i, i);\n        }\n    }\n\n    \/\/ \u6700\u9069\u5316\u3055\u308c\u305fBitmap\u306e\u4f5c\u6210\n    var bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);\n    bitmap.Palette = palette;\n    return bitmap;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u4f7f\u7528\u3057\u305f\u5927\u5bb9\u91cf\u753b\u50cf\u306e\u52b9\u7387\u7684\u306a\u8aad\u307f\u8fbc\u307f<\/h3>\n\n\n\n<p>\u5927\u304d\u306a\u30b5\u30a4\u30ba\u306e\u753b\u50cf\u3092\u6271\u3046\u5834\u5408\u3001\u30e1\u30e2\u30ea\u306e\u52b9\u7387\u7684\u306a\u4f7f\u7528\u304c\u7279\u306b\u91cd\u8981\u306b\u306a\u308a\u307e\u3059\u3002<br>\u4ee5\u4e0b\u306b\u3001\u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u8aad\u307f\u8fbc\u307f\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public async Task&lt;Bitmap&gt; LoadLargeImageAsync(string filePath)\n{\n    using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);\n    using var memoryStream = new MemoryStream();\n\n    \/\/ \u30d0\u30c3\u30d5\u30a1\u30b5\u30a4\u30ba\u3092\u6307\u5b9a\u3057\u3066\u8aad\u307f\u8fbc\u307f\n    const int bufferSize = 81920; \/\/ 80KB\n    await fileStream.CopyToAsync(memoryStream, bufferSize);\n\n    memoryStream.Position = 0;\n    return new Bitmap(memoryStream);\n}\n\n\/\/ \u4f7f\u7528\u4f8b\npublic async Task ProcessLargeImageAsync()\n{\n    try\n    {\n        using var bitmap = await LoadLargeImageAsync(\"large-image.jpg\");\n        \/\/ \u753b\u50cf\u51e6\u7406\n    }\n    catch (OutOfMemoryException ex)\n    {\n        \/\/ \u30e1\u30e2\u30ea\u4e0d\u8db3\u6642\u306e\u51e6\u7406\n        Console.WriteLine($\"\u30e1\u30e2\u30ea\u4e0d\u8db3\u30a8\u30e9\u30fc: {ex.Message}\");\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u753b\u50cf\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5225\u306e\u6700\u9069\u306a\u8aad\u307f\u8fbc\u307f\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5404\u753b\u50cf\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306b\u306f\u7279\u6709\u306e\u7279\u5fb4\u304c\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u306b\u9069\u3057\u305f\u8aad\u307f\u8fbc\u307f\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ImageLoader\n{\n    public static Bitmap LoadImageOptimized(string filePath)\n    {\n        var extension = Path.GetExtension(filePath).ToLower();\n\n        switch (extension)\n        {\n            case \".jpg\":\n            case \".jpeg\":\n                return LoadJpeg(filePath);\n            case \".png\":\n                return LoadPng(filePath);\n            case \".bmp\":\n                return LoadBmp(filePath);\n            default:\n                throw new NotSupportedException($\"\u672a\u30b5\u30dd\u30fc\u30c8\u306e\u753b\u50cf\u5f62\u5f0f: {extension}\");\n        }\n    }\n\n    private static Bitmap LoadJpeg(string filePath)\n    {\n        \/\/ JPEG\u7279\u6709\u306e\u6700\u9069\u5316\n        using var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);\n        var bitmap = new Bitmap(stream);\n\n        \/\/ JPEG\u306e\u5834\u5408\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u753b\u8cea\u3092\u8abf\u6574\n        if (bitmap.Width &gt; 2000 || bitmap.Height &gt; 2000)\n        {\n            return ResizeImage(bitmap, bitmap.Width \/ 2, bitmap.Height \/ 2);\n        }\n        return bitmap;\n    }\n\n    private static Bitmap LoadPng(string filePath)\n    {\n        \/\/ PNG\u7279\u6709\u306e\u6700\u9069\u5316\uff08\u30a2\u30eb\u30d5\u30a1\u30c1\u30e3\u30f3\u30cd\u30eb\u51e6\u7406\uff09\n        using var bitmap = new Bitmap(filePath);\n        if (bitmap.PixelFormat == PixelFormat.Format32bppArgb)\n        {\n            \/\/ \u30a2\u30eb\u30d5\u30a1\u30c1\u30e3\u30f3\u30cd\u30eb\u304c\u5fc5\u8981\u306a\u3044\u5834\u5408\u306f24bpp\u306b\u5909\u63db\n            return ConvertTo24bpp(bitmap);\n        }\n        return new Bitmap(bitmap);\n    }\n\n    private static Bitmap LoadBmp(string filePath)\n    {\n        \/\/ BMP\u306e\u5834\u5408\u3001\u76f4\u63a5\u30e1\u30e2\u30ea\u306b\u30de\u30c3\u30d7\n        using var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);\n        return new Bitmap(stream);\n    }\n\n    private static Bitmap ResizeImage(Bitmap source, int width, int height)\n    {\n        var dest = new Bitmap(width, height);\n        using var g = Graphics.FromImage(dest);\n        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;\n        g.DrawImage(source, 0, 0, width, height);\n        return dest;\n    }\n\n    private static Bitmap ConvertTo24bpp(Bitmap source)\n    {\n        var dest = new Bitmap(source.Width, source.Height, PixelFormat.Format24bppRgb);\n        using var g = Graphics.FromImage(dest);\n        g.DrawImage(source, 0, 0);\n        return dest;\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u306e\u5b9f\u88c5\u3067\u306f\u4ee5\u4e0b\u306e\u70b9\u306b\u6ce8\u610f\u3092\u6255\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-box sng-box box6\">\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5225\u306e\u6700\u9069\u5316\u51e6\u7406<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u5fc5\u8981\u306b\u5fdc\u3058\u305f\u753b\u50cf\u306e\u6700\u9069\u5316\uff08\u30ea\u30b5\u30a4\u30ba\u3001\u30d4\u30af\u30bb\u30eb\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db\uff09<\/li>\n<\/ul>\n<\/div>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u65b9\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u753b\u50cf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3092\u9632\u3050Bitmap\u64cd\u4f5c\u306e\u5b9f\u8df5\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">using\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u4f7f\u7528\u3057\u305f\u9069\u5207\u306a\u30ea\u30bd\u30fc\u30b9\u89e3\u653e<\/h3>\n\n\n\n<p>Bitmap\u30af\u30e9\u30b9\u306f\u30a2\u30f3\u30de\u30cd\u30fc\u30b8\u30c9\u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u3001\u9069\u5207\u306a\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u304c\u91cd\u8981\u3067\u3059\u3002using\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u78ba\u5b9f\u306b\u30ea\u30bd\u30fc\u30b9\u3092\u89e3\u653e\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class SafeBitmapHandler\n{\n    \/\/ \u57fa\u672c\u7684\u306ausing\u30d1\u30bf\u30fc\u30f3\n    public void BasicImageProcessing(string inputPath, string outputPath)\n    {\n        using (var sourceImage = new Bitmap(inputPath))\n        using (var processedImage = new Bitmap(sourceImage.Width, sourceImage.Height))\n        {\n            \/\/ \u753b\u50cf\u51e6\u7406\n            using (var g = Graphics.FromImage(processedImage))\n            {\n                g.DrawImage(sourceImage, 0, 0);\n            }\n            processedImage.Save(outputPath);\n        } \/\/ \u81ea\u52d5\u7684\u306bDispose\u304c\u547c\u3070\u308c\u308b\n    }\n\n    \/\/ \u8907\u6570\u306e\u753b\u50cf\u3092\u6271\u3046\u5834\u5408\n    public void ProcessMultipleImages(string[] imagePaths)\n    {\n        var processedImages = new List&lt;Bitmap&gt;();\n        try\n        {\n            foreach (var path in imagePaths)\n            {\n                using var image = new Bitmap(path);\n                \/\/ \u51e6\u7406\u6e08\u307f\u753b\u50cf\u3092\u5225\u306e\u30ea\u30b9\u30c8\u3067\u7ba1\u7406\n                var processed = ProcessImage(image);\n                processedImages.Add(processed);\n            }\n\n            \/\/ \u51e6\u7406\u6e08\u307f\u753b\u50cf\u306e\u5229\u7528\n            SaveProcessedImages(processedImages);\n        }\n        finally\n        {\n            \/\/ \u5168\u3066\u306e\u51e6\u7406\u6e08\u307f\u753b\u50cf\u3092\u78ba\u5b9f\u306b\u89e3\u653e\n            foreach (var image in processedImages)\n            {\n                image?.Dispose();\n            }\n        }\n    }\n\n    private Bitmap ProcessImage(Bitmap source)\n    {\n        var result = new Bitmap(source.Width, source.Height);\n        try\n        {\n            using var g = Graphics.FromImage(result);\n            g.DrawImage(source, 0, 0);\n            return result;\n        }\n        catch\n        {\n            result.Dispose(); \/\/ \u30a8\u30e9\u30fc\u6642\u306f\u78ba\u5b9f\u306b\u89e3\u653e\n            throw;\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">Dispose()\u30e1\u30bd\u30c3\u30c9\u306e\u6b63\u3057\u3044\u547c\u3073\u51fa\u3057\u30bf\u30a4\u30df\u30f3\u30b0<\/h3>\n\n\n\n<p>Dispose\u30e1\u30bd\u30c3\u30c9\u306e\u547c\u3073\u51fa\u3057\u30bf\u30a4\u30df\u30f3\u30b0\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5b89\u5b9a\u6027\u306b\u5927\u304d\u304f\u5f71\u97ff\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BitmapResourceManager : IDisposable\n{\n    private bool disposed = false;\n    private readonly List&lt;Bitmap&gt; managedBitmaps = new();\n    private readonly object lockObject = new();\n\n    public void AddBitmap(Bitmap bitmap)\n    {\n        ThrowIfDisposed();\n        lock (lockObject)\n        {\n            managedBitmaps.Add(bitmap);\n        }\n    }\n\n    public void RemoveBitmap(Bitmap bitmap)\n    {\n        ThrowIfDisposed();\n        lock (lockObject)\n        {\n            if (managedBitmaps.Contains(bitmap))\n            {\n                bitmap.Dispose();\n                managedBitmaps.Remove(bitmap);\n            }\n        }\n    }\n\n    \/\/ IDisposable\u306e\u5b9f\u88c5\n    public void Dispose()\n    {\n        Dispose(true);\n        GC.SuppressFinalize(this);\n    }\n\n    protected virtual void Dispose(bool disposing)\n    {\n        if (!disposed)\n        {\n            if (disposing)\n            {\n                lock (lockObject)\n                {\n                    foreach (var bitmap in managedBitmaps)\n                    {\n                        bitmap?.Dispose();\n                    }\n                    managedBitmaps.Clear();\n                }\n            }\n            disposed = true;\n        }\n    }\n\n    private void ThrowIfDisposed()\n    {\n        if (disposed)\n        {\n            throw new ObjectDisposedException(nameof(BitmapResourceManager));\n        }\n    }\n\n    ~BitmapResourceManager()\n    {\n        Dispose(false);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">GC\u306b\u983c\u3089\u306a\u3044\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>GC\u306b\u4f9d\u5b58\u305b\u305a\u3001\u7a4d\u6975\u7684\u306b\u30e1\u30e2\u30ea\u3092\u7ba1\u7406\u3059\u308b\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ActiveMemoryManager\n{\n    private readonly int memoryThreshold;\n    private readonly Queue&lt;WeakReference&lt;Bitmap&gt;&gt; imageCache;\n    private long currentMemoryUsage;\n\n    public ActiveMemoryManager(int thresholdInMB)\n    {\n        memoryThreshold = thresholdInMB * 1024 * 1024; \/\/ MB to bytes\n        imageCache = new Queue&lt;WeakReference&lt;Bitmap&gt;&gt;();\n        currentMemoryUsage = 0;\n    }\n\n    public void CacheBitmap(Bitmap bitmap)\n    {\n        \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8a08\u7b97\n        long bitmapSize = bitmap.Width * bitmap.Height * 4; \/\/ 32bpp\u60f3\u5b9a\n\n        \/\/ \u30e1\u30e2\u30ea\u95be\u5024\u30c1\u30a7\u30c3\u30af\n        while (currentMemoryUsage + bitmapSize &gt; memoryThreshold &amp;&amp; imageCache.Count &gt; 0)\n        {\n            \/\/ \u53e4\u3044\u753b\u50cf\u306e\u89e3\u653e\n            var oldRef = imageCache.Dequeue();\n            if (oldRef.TryGetTarget(out var oldBitmap))\n            {\n                currentMemoryUsage -= oldBitmap.Width * oldBitmap.Height * 4;\n                oldBitmap.Dispose();\n            }\n        }\n\n        \/\/ \u65b0\u3057\u3044\u753b\u50cf\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\n        imageCache.Enqueue(new WeakReference&lt;Bitmap&gt;(bitmap));\n        currentMemoryUsage += bitmapSize;\n    }\n\n    public void ReleaseUnusedMemory()\n    {\n        var newCache = new Queue&lt;WeakReference&lt;Bitmap&gt;&gt;();\n        currentMemoryUsage = 0;\n\n        while (imageCache.Count &gt; 0)\n        {\n            var reference = imageCache.Dequeue();\n            if (reference.TryGetTarget(out var bitmap))\n            {\n                newCache.Enqueue(reference);\n                currentMemoryUsage += bitmap.Width * bitmap.Height * 4;\n            }\n        }\n\n        imageCache.Clear();\n        foreach (var reference in newCache)\n        {\n            imageCache.Enqueue(reference);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u5373\u6642\u89e3\u653e\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>Dispose\u30d1\u30bf\u30fc\u30f3\u306e\u9069\u5207\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>using\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u660e\u793a\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u89e3\u653e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u5b9a\u671f\u7684\u306a\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u95be\u5024\u306b\u57fa\u3065\u304f\u81ea\u52d5\u89e3\u653e<\/li>\n\n\n\n<li>WeakReference\u306e\u6d3b\u7528<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u5b9f\u88c5\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u540c\u671f\u6a5f\u69cb\u306e\u9069\u5207\u306a\u4f7f\u7528<\/li>\n\n\n\n<li>\u6392\u4ed6\u5236\u5fa1\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7af6\u5408\u306e\u9632\u6b62<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u3092\u9632\u304e\u3064\u3064\u52b9\u7387\u7684\u306aBitmap\u64cd\u4f5c\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">\u9ad8\u901f\u306a\u753b\u50cf\u51e6\u7406\u3092\u5b9f\u73fe\u3059\u308bBitmap\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u3078\u306e\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u65b9\u6cd5<\/h3>\n\n\n\n<p>Bitmap\u306e\u51e6\u7406\u901f\u5ea6\u3092\u6700\u5927\u9650\u306b\u9ad8\u3081\u308b\u305f\u3081\u306b\u3001\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u3078\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\u3059\u308b\u65b9\u6cd5\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class FastBitmapProcessor\n{\n    public unsafe void ProcessImageDirect(Bitmap bitmap)\n    {\n        \/\/ \u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u3092\u30ed\u30c3\u30af\n        BitmapData bitmapData = bitmap.LockBits(\n            new Rectangle(0, 0, bitmap.Width, bitmap.Height),\n            ImageLockMode.ReadWrite,\n            PixelFormat.Format32bppArgb);\n\n        try\n        {\n            \/\/ \u30dd\u30a4\u30f3\u30bf\u3092\u4f7f\u7528\u3057\u3066\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u306b\u76f4\u63a5\u30a2\u30af\u30bb\u30b9\n            byte* ptr = (byte*)bitmapData.Scan0.ToPointer();\n\n            \/\/ 1\u30d4\u30af\u30bb\u30eb\u3042\u305f\u308a\u306e\u30d0\u30a4\u30c8\u6570\n            int bytesPerPixel = 4;\n\n            \/\/ \u5404\u30d4\u30af\u30bb\u30eb\u3092\u51e6\u7406\n            for (int y = 0; y &lt; bitmap.Height; y++)\n            {\n                for (int x = 0; x &lt; bitmap.Width; x++)\n                {\n                    int currentByte = y * bitmapData.Stride + x * bytesPerPixel;\n\n                    \/\/ BGRA\u306e\u9806\u3067\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\n                    byte blue = ptr[currentByte];\n                    byte green = ptr[currentByte + 1];\n                    byte red = ptr[currentByte + 2];\n                    byte alpha = ptr[currentByte + 3];\n\n                    \/\/ \u753b\u50cf\u51e6\u7406\uff08\u4f8b\uff1a\u660e\u308b\u3055\u3092\u4e0a\u3052\u308b\uff09\n                    ptr[currentByte] = (byte)Math.Min(blue + 50, 255);\n                    ptr[currentByte + 1] = (byte)Math.Min(green + 50, 255);\n                    ptr[currentByte + 2] = (byte)Math.Min(red + 50, 255);\n                }\n            }\n        }\n        finally\n        {\n            \/\/ \u5fc5\u305a\u89e3\u653e\n            bitmap.UnlockBits(bitmapData);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/h3>\n\n\n\n<p>\u30de\u30eb\u30c1\u30b3\u30a2\u30d7\u30ed\u30bb\u30c3\u30b5\u3092\u6d3b\u7528\u3057\u3066\u753b\u50cf\u51e6\u7406\u3092\u9ad8\u901f\u5316\u3059\u308b\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u4e26\u5217\u51e6\u7406\u3092\u6d3b\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u306e\u9ad8\u901f\u5316<\/h3>\n\n\n\n<p>\u30de\u30eb\u30c1\u30b3\u30a2\u30d7\u30ed\u30bb\u30c3\u30b5\u3092\u6d3b\u7528\u3057\u3066\u753b\u50cf\u51e6\u7406\u3092\u9ad8\u901f\u5316\u3059\u308b\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ParallelImageProcessor\n{\n    public void ProcessImageParallel(Bitmap bitmap)\n    {\n        \/\/ \u753b\u50cf\u3092\u8907\u6570\u306e\u9818\u57df\u306b\u5206\u5272\u3057\u3066\u4e26\u5217\u51e6\u7406\n        int stripHeight = bitmap.Height \/ Environment.ProcessorCount;\n        var tasks = new List&lt;Task&gt;();\n\n        for (int i = 0; i &lt; Environment.ProcessorCount; i++)\n        {\n            int startY = i * stripHeight;\n            int endY = (i == Environment.ProcessorCount - 1) ? \n                      bitmap.Height : \n                      (i + 1) * stripHeight;\n\n            tasks.Add(Task.Run(() =&gt; \n                ProcessImageStrip(bitmap, startY, endY)));\n        }\n\n        Task.WaitAll(tasks.ToArray());\n    }\n\n    private unsafe void ProcessImageStrip(Bitmap bitmap, int startY, int endY)\n    {\n        var rect = new Rectangle(0, startY, bitmap.Width, endY - startY);\n        BitmapData bitmapData = bitmap.LockBits(rect, \n            ImageLockMode.ReadWrite, \n            PixelFormat.Format32bppArgb);\n\n        try\n        {\n            byte* ptr = (byte*)bitmapData.Scan0.ToPointer();\n\n            for (int y = 0; y &lt; rect.Height; y++)\n            {\n                for (int x = 0; x &lt; bitmap.Width; x++)\n                {\n                    int currentByte = y * bitmapData.Stride + x * 4;\n                    ProcessPixel(ptr + currentByte);\n                }\n            }\n        }\n        finally\n        {\n            bitmap.UnlockBits(bitmapData);\n        }\n    }\n\n    private unsafe void ProcessPixel(byte* ptr)\n    {\n        \/\/ \u30d4\u30af\u30bb\u30eb\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n        ptr[0] = (byte)Math.Min(ptr[0] * 1.2, 255); \/\/ Blue\n        ptr[1] = (byte)Math.Min(ptr[1] * 1.2, 255); \/\/ Green\n        ptr[2] = (byte)Math.Min(ptr[2] * 1.2, 255); \/\/ Red\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">unsafe context\u3092\u4f7f\u7528\u3057\u305f\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>unsafe\u30b3\u30fc\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001\u3055\u3089\u306a\u308b\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class UnsafeImageOptimizer\n{\n    public unsafe void ApplyFilter(Bitmap bitmap, float[] kernel)\n    {\n        if (kernel.Length != 9) \/\/ 3x3\u30ab\u30fc\u30cd\u30eb\u3092\u60f3\u5b9a\n            throw new ArgumentException(\"Invalid kernel size\");\n\n        int width = bitmap.Width;\n        int height = bitmap.Height;\n\n        \/\/ \u7d50\u679c\u3092\u683c\u7d0d\u3059\u308b\u65b0\u3057\u3044\u30d3\u30c3\u30c8\u30de\u30c3\u30d7\n        var result = new Bitmap(width, height);\n\n        BitmapData srcData = bitmap.LockBits(\n            new Rectangle(0, 0, width, height),\n            ImageLockMode.ReadOnly,\n            PixelFormat.Format32bppArgb);\n\n        BitmapData destData = result.LockBits(\n            new Rectangle(0, 0, width, height),\n            ImageLockMode.WriteOnly,\n            PixelFormat.Format32bppArgb);\n\n        try\n        {\n            byte* src = (byte*)srcData.Scan0.ToPointer();\n            byte* dest = (byte*)destData.Scan0.ToPointer();\n\n            \/\/ \u5404\u30d4\u30af\u30bb\u30eb\u306b\u5bfe\u3057\u3066\u30d5\u30a3\u30eb\u30bf\u3092\u9069\u7528\n            Parallel.For(1, height - 1, y =&gt;\n            {\n                for (int x = 1; x &lt; width - 1; x++)\n                {\n                    for (int c = 0; c &lt; 3; c++) \/\/ RGB\u5404\u30c1\u30e3\u30cd\u30eb\n                    {\n                        float sum = 0;\n\n                        \/\/ 3x3\u30ab\u30fc\u30cd\u30eb\u306e\u9069\u7528\n                        for (int ky = -1; ky &lt;= 1; ky++)\n                        {\n                            for (int kx = -1; kx &lt;= 1; kx++)\n                            {\n                                int pixel = ((y + ky) * srcData.Stride + \n                                           (x + kx) * 4 + c);\n                                sum += src[pixel] * \n                                      kernel[(ky + 1) * 3 + (kx + 1)];\n                            }\n                        }\n\n                        \/\/ \u7d50\u679c\u3092\u4fdd\u5b58\n                        dest[y * destData.Stride + x * 4 + c] = \n                            (byte)Math.Max(0, Math.Min(255, sum));\n                    }\n                    \/\/ \u30a2\u30eb\u30d5\u30a1\u30c1\u30e3\u30cd\u30eb\u3092\u30b3\u30d4\u30fc\n                    dest[y * destData.Stride + x * 4 + 3] = \n                        src[y * srcData.Stride + x * 4 + 3];\n                }\n            });\n        }\n        finally\n        {\n            bitmap.UnlockBits(srcData);\n            result.UnlockBits(destData);\n        }\n\n        \/\/ \u5143\u306e\u30d3\u30c3\u30c8\u30de\u30c3\u30d7\u3092\u66f4\u65b0\n        using (var g = Graphics.FromImage(bitmap))\n        {\n            g.DrawImage(result, 0, 0);\n        }\n        result.Dispose();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u30a2\u30af\u30bb\u30b9\u306e\u6700\u9069\u5316\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30d4\u30af\u30bb\u30eb\u30c7\u30fc\u30bf\u306e\u76f4\u63a5\u64cd\u4f5c<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u306e\u30ed\u30c3\u30af\u7bc4\u56f2\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a2\u30af\u30bb\u30b9\u30d1\u30bf\u30fc\u30f3<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u4e26\u5217\u51e6\u7406\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u9069\u5207\u306a\u7c92\u5ea6\u3067\u306e\u4e26\u5217\u5316<\/li>\n\n\n\n<li>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u51e6\u7406\u9818\u57df\u306e\u52b9\u7387\u7684\u306a\u5206\u5272<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>unsafe \u30b3\u30fc\u30c9\u306e\u9069\u5207\u306a\u4f7f\u7528\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30dd\u30a4\u30f3\u30bf\u64cd\u4f5c\u306b\u3088\u308b\u9ad8\u901f\u5316<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u8cac\u4efb<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u91cd\u8981\u6027<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u9ad8\u901f\u3067\u52b9\u7387\u7684\u306a\u753b\u50cf\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-30\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306eBitmap\u5b9f\u88c5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">System.Drawing.Common\u306e\u5236\u9650\u4e8b\u9805\u3068\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>.NET 6\u4ee5\u964d\u3001System.Drawing.Common\u306b\u306f\u91cd\u8981\u306a\u5236\u9650\u304c\u52a0\u3048\u3089\u308c\u307e\u3057\u305f\u3002\u7279\u306bWindows\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u4ee5\u5916\u3067\u306e\u4f7f\u7528\u306b\u95a2\u3059\u308b\u5236\u9650\u306b\u3064\u3044\u3066\u3001\u305d\u306e\u5bfe\u51e6\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class PlatformAwareBitmapHandler\n{\n    public static bool IsWindowsPlatform()\n    {\n        return OperatingSystem.IsWindows();\n    }\n\n    public async Task&lt;byte[]&gt; ProcessImageAsync(string inputPath)\n    {\n        if (IsWindowsPlatform())\n        {\n            \/\/ Windows\u74b0\u5883\u3067\u306e\u51e6\u7406\n            return await ProcessWithSystemDrawingAsync(inputPath);\n        }\n        else\n        {\n            \/\/ \u975eWindows\u74b0\u5883\u3067\u306e\u51e6\u7406\n            return await ProcessWithImageSharpAsync(inputPath);\n        }\n    }\n\n    private async Task&lt;byte[]&gt; ProcessWithSystemDrawingAsync(string inputPath)\n    {\n        using var bitmap = new Bitmap(inputPath);\n        using var ms = new MemoryStream();\n        bitmap.Save(ms, ImageFormat.Png);\n        return ms.ToArray();\n    }\n\n    private async Task&lt;byte[]&gt; ProcessWithImageSharpAsync(string inputPath)\n    {\n        \/\/ ImageSharp\u3092\u4f7f\u7528\u3057\u305f\u51e6\u7406\n        using var image = await SixLabors.ImageSharp.Image.LoadAsync(inputPath);\n        using var ms = new MemoryStream();\n        await image.SaveAsPngAsync(ms);\n        return ms.ToArray();\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-32\">\u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30eaImageSharp\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p>ImageSharp\u306f\u3001\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u306e\u753b\u50cf\u51e6\u7406\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u3057\u3066\u5e83\u304f\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ImageSharpProcessor\n{\n    public async Task ProcessImageWithImageSharp(string inputPath, string outputPath)\n    {\n        using var image = await Image.LoadAsync(inputPath);\n\n        \/\/ \u753b\u50cf\u51e6\u7406\u306e\u4f8b\n        image.Mutate(x =&gt; x\n            .Resize(new ResizeOptions\n            {\n                Size = new Size(800, 600),\n                Mode = ResizeMode.Max\n            })\n            .Grayscale()\n            .GaussianBlur(3.5f));\n\n        await image.SaveAsync(outputPath);\n    }\n\n    \/\/ \u753b\u50cf\u51e6\u7406\u306e\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30d1\u30bf\u30fc\u30f3\u5b9f\u88c5\n    public interface IImageProcessor\n    {\n        Task&lt;byte[]&gt; ProcessImageAsync(Stream imageStream);\n    }\n\n    public class ImageSharpProcessor : IImageProcessor\n    {\n        public async Task&lt;byte[]&gt; ProcessImageAsync(Stream imageStream)\n        {\n            using var image = await Image.LoadAsync(imageStream);\n            using var ms = new MemoryStream();\n\n            \/\/ \u51e6\u7406\u3092\u9069\u7528\n            image.Mutate(x =&gt; x\n                .Contrast(1.1f)\n                .Saturate(1.1f));\n\n            await image.SaveAsPngAsync(ms);\n            return ms.ToArray();\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5225\u306e\u6700\u9069\u5316\u6226\u7565<\/h3>\n\n\n\n<p>\u5404\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306e\u7279\u6027\u3092\u8003\u616e\u3057\u305f\u6700\u9069\u5316\u6226\u7565\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CrossPlatformImageService\n{\n    private readonly IImageProcessor _imageProcessor;\n\n    public CrossPlatformImageService()\n    {\n        _imageProcessor = CreatePlatformSpecificProcessor();\n    }\n\n    private IImageProcessor CreatePlatformSpecificProcessor()\n    {\n        if (OperatingSystem.IsWindows())\n        {\n            return new WindowsImageProcessor();\n        }\n        else if (OperatingSystem.IsLinux())\n        {\n            return new LinuxImageProcessor();\n        }\n        else if (OperatingSystem.IsMacOS())\n        {\n            return new MacImageProcessor();\n        }\n        else\n        {\n            return new FallbackImageProcessor();\n        }\n    }\n\n    public async Task&lt;ImageProcessingResult&gt; ProcessImageAsync(\n        string inputPath,\n        ProcessingOptions options)\n    {\n        try\n        {\n            using var fileStream = File.OpenRead(inputPath);\n            var processedData = await _imageProcessor.ProcessImageAsync(\n                fileStream, \n                options);\n\n            return new ImageProcessingResult\n            {\n                Success = true,\n                ProcessedData = processedData,\n                Platform = Environment.OSVersion.Platform.ToString()\n            };\n        }\n        catch (Exception ex)\n        {\n            return new ImageProcessingResult\n            {\n                Success = false,\n                ErrorMessage = ex.Message,\n                Platform = Environment.OSVersion.Platform.ToString()\n            };\n        }\n    }\n}\n\npublic class ProcessingOptions\n{\n    public int? MaxWidth { get; set; }\n    public int? MaxHeight { get; set; }\n    public float? Quality { get; set; }\n    public bool PreserveMetadata { get; set; }\n    public Dictionary&lt;string, string&gt; CustomOptions { get; set; }\n}\n\npublic class ImageProcessingResult\n{\n    public bool Success { get; set; }\n    public byte[] ProcessedData { get; set; }\n    public string ErrorMessage { get; set; }\n    public string Platform { get; set; }\n    public Dictionary&lt;string, string&gt; Metadata { get; set; }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u691c\u51fa\u3068\u5206\u5c90\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>OS\u56fa\u6709\u306e\u6a5f\u80fd\u306e\u9069\u5207\u306a\u691c\u51fa<\/li>\n\n\n\n<li>\u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\u6a5f\u80fd\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u9078\u629e\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>ImageSharp\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>SkiaSharp\u306e\u691c\u8a0e<\/li>\n\n\n\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709API\u306e\u6d3b\u7528<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ed\u30b0\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u51e6\u7406<\/li>\n\n\n\n<li>\u8a73\u7d30\u306a\u30ed\u30b0\u8a18\u9332<\/li>\n\n\n\n<li>\u30b0\u30ec\u30fc\u30b9\u30d5\u30eb\u30c7\u30b0\u30e9\u30c7\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5b9a\u3057\u305f\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-35\">Bitmap\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u624b\u6cd5<\/h3>\n\n\n\n<p>Bitmap\u306e\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6b63\u78ba\u306b\u6e2c\u5b9a\u3057\u3001\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BitmapProfiler\n{\n    private readonly PerformanceCounter _memCounter;\n\n    public BitmapProfiler()\n    {\n        _memCounter = new PerformanceCounter(\"Process\", \"Private Bytes\",\n            Process.GetCurrentProcess().ProcessName);\n    }\n\n    public async Task&lt;ProfilingResult&gt; ProfileBitmapOperationAsync(\n        Func&lt;Task&gt; operation)\n    {\n        var result = new ProfilingResult();\n        result.InitialMemory = GetCurrentMemoryUsage();\n\n        var sw = Stopwatch.StartNew();\n        await operation();\n        sw.Stop();\n\n        result.FinalMemory = GetCurrentMemoryUsage();\n        result.ExecutionTime = sw.ElapsedMilliseconds;\n        result.MemoryDelta = result.FinalMemory - result.InitialMemory;\n\n        return result;\n    }\n\n    private long GetCurrentMemoryUsage()\n    {\n        GC.Collect();\n        GC.WaitForPendingFinalizers();\n        return Process.GetCurrentProcess().WorkingSet64;\n    }\n\n    \/\/ \u4f7f\u7528\u4f8b\n    public async Task ProfilingExample()\n    {\n        var profiler = new BitmapProfiler();\n        var result = await profiler.ProfileBitmapOperationAsync(async () =&gt;\n        {\n            using var bitmap = new Bitmap(1920, 1080);\n            \/\/ \u753b\u50cf\u51e6\u7406\u64cd\u4f5c\n            await Task.Delay(100); \/\/ \u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\n        });\n\n        Console.WriteLine($\"\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5909\u5316: {result.MemoryDelta \/ 1024 \/ 1024}MB\");\n        Console.WriteLine($\"\u5b9f\u884c\u6642\u9593: {result.ExecutionTime}ms\");\n    }\n}\n\npublic class ProfilingResult\n{\n    public long InitialMemory { get; set; }\n    public long FinalMemory { get; set; }\n    public long MemoryDelta { get; set; }\n    public long ExecutionTime { get; set; }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u753b\u50cf\u51e6\u7406\u901f\u5ea6\u306e\u6e2c\u5b9a\u3068\u6700\u9069\u5316<\/h3>\n\n\n\n<p>\u753b\u50cf\u51e6\u7406\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6e2c\u5b9a\u3057\u3001\u6700\u9069\u5316\u3059\u308b\u305f\u3081\u306e\u5b9f\u88c5\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BitmapPerformanceOptimizer\n{\n    public class PerformanceMetrics\n    {\n        public double ProcessingTimeMs { get; set; }\n        public long MemoryUsedBytes { get; set; }\n        public int PixelsProcessed { get; set; }\n\n        public double PixelsPerMillisecond =&gt; \n            PixelsProcessed \/ ProcessingTimeMs;\n\n        public double MegabytesPerSecond =&gt; \n            (MemoryUsedBytes \/ 1024.0 \/ 1024.0) \/ (ProcessingTimeMs \/ 1000.0);\n    }\n\n    public async Task&lt;PerformanceMetrics&gt; MeasurePerformance(\n        Bitmap bitmap,\n        Action&lt;Bitmap&gt; processingAction)\n    {\n        var metrics = new PerformanceMetrics\n        {\n            PixelsProcessed = bitmap.Width * bitmap.Height\n        };\n\n        var initialMemory = GC.GetTotalMemory(true);\n        var sw = Stopwatch.StartNew();\n\n        processingAction(bitmap);\n\n        sw.Stop();\n        var finalMemory = GC.GetTotalMemory(true);\n\n        metrics.ProcessingTimeMs = sw.ElapsedMilliseconds;\n        metrics.MemoryUsedBytes = finalMemory - initialMemory;\n\n        return metrics;\n    }\n\n    public async Task&lt;PerformanceMetrics&gt; OptimizeProcessing(\n        Bitmap bitmap,\n        Action&lt;Bitmap&gt; processingAction)\n    {\n        \/\/ \u6700\u9069\u306a\u51e6\u7406\u30b5\u30a4\u30ba\u3092\u6c7a\u5b9a\n        var optimalChunkSize = DetermineOptimalChunkSize(bitmap);\n\n        return await MeasurePerformance(bitmap, b =&gt;\n        {\n            Parallel.For(0, bitmap.Height \/ optimalChunkSize + 1, i =&gt;\n            {\n                var startY = i * optimalChunkSize;\n                var height = Math.Min(optimalChunkSize, \n                    bitmap.Height - startY);\n\n                ProcessImageChunk(b, startY, height, processingAction);\n            });\n        });\n    }\n\n    private void ProcessImageChunk(Bitmap bitmap, int startY, int height,\n        Action&lt;Bitmap&gt; processingAction)\n    {\n        var rect = new Rectangle(0, startY, bitmap.Width, height);\n        using var chunk = bitmap.Clone(rect, bitmap.PixelFormat);\n        processingAction(chunk);\n\n        using var g = Graphics.FromImage(bitmap);\n        g.DrawImage(chunk, 0, startY);\n    }\n\n    private int DetermineOptimalChunkSize(Bitmap bitmap)\n    {\n        \/\/ CPU\u6570\u3068\u30ad\u30e3\u30c3\u30b7\u30e5\u30b5\u30a4\u30ba\u3092\u8003\u616e\u3057\u305f\u6700\u9069\u5316\n        var processorCount = Environment.ProcessorCount;\n        var approximatePixelSize = 4; \/\/ 32bpp\n        var targetChunkSize = bitmap.Width * \n            (bitmap.Height \/ processorCount);\n\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30e9\u30a4\u30f3\u306b\u5408\u308f\u305b\u308b\uff08\u4e00\u822c\u7684\u306a\u5024\uff09\n        const int cacheLineSize = 64;\n        return (targetChunkSize * approximatePixelSize \/ cacheLineSize) * \n            cacheLineSize \/ approximatePixelSize;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\u7d50\u679c\u306e\u4f8b<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class PerformanceBenchmark\n{\n    public static async Task&lt;BenchmarkResult&gt; RunBenchmarkAsync()\n    {\n        var result = new BenchmarkResult();\n        var testSizes = new[] { \n            (1920, 1080), \/\/ Full HD\n            (3840, 2160), \/\/ 4K\n            (7680, 4320)  \/\/ 8K\n        };\n\n        foreach (var (width, height) in testSizes)\n        {\n            var metrics = await MeasureOperations(width, height);\n            result.AddResult($\"{width}x{height}\", metrics);\n        }\n\n        return result;\n    }\n\n    private static async Task&lt;OperationMetrics&gt; MeasureOperations(\n        int width, \n        int height)\n    {\n        var metrics = new OperationMetrics();\n        using var bitmap = new Bitmap(width, height);\n\n        \/\/ \u4f5c\u6210\u6642\u9593\u306e\u6e2c\u5b9a\n        var sw = Stopwatch.StartNew();\n        using var newBitmap = new Bitmap(width, height);\n        sw.Stop();\n        metrics.CreationTime = sw.ElapsedMilliseconds;\n\n        \/\/ \u30d4\u30af\u30bb\u30eb\u64cd\u4f5c\u306e\u6e2c\u5b9a\n        sw.Restart();\n        await Task.Run(() =&gt;\n        {\n            for (int x = 0; x &lt; width; x++)\n            {\n                for (int y = 0; y &lt; height; y++)\n                {\n                    bitmap.SetPixel(x, y, Color.Red);\n                }\n            }\n        });\n        sw.Stop();\n        metrics.PixelOperationTime = sw.ElapsedMilliseconds;\n\n        return metrics;\n    }\n}\n\npublic class BenchmarkResult\n{\n    public Dictionary&lt;string, OperationMetrics&gt; Results { get; } = new();\n\n    public void AddResult(string resolution, OperationMetrics metrics)\n    {\n        Results[resolution] = metrics;\n    }\n}\n\npublic class OperationMetrics\n{\n    public long CreationTime { get; set; }\n    public long PixelOperationTime { get; set; }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">\u5178\u578b\u7684\u306a\u6e2c\u5b9a\u7d50\u679c<\/h4>\n\n\n<div id=\"id-4562f826-931f-45e5-8ac0-3ace69794837\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u89e3\u50cf\u5ea6<\/th><th>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf<\/th><th>\u4f5c\u6210\u6642\u9593<\/th><th>\u30d4\u30af\u30bb\u30eb\u64cd\u4f5c\u6642\u9593<\/th><\/tr><\/thead><tbody><tr><td>1920\u00d71080<\/td><td>\u7d048MB<\/td><td>5-10ms<\/td><td>200-300ms<\/td><\/tr><tr><td>3840\u00d72160<\/td><td>\u7d0432MB<\/td><td>15-25ms<\/td><td>800-1000ms<\/td><\/tr><tr><td>7680\u00d74320<\/td><td>\u7d04128MB<\/td><td>40-60ms<\/td><td>3000-4000ms<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u6570\u5024\u306f\u4e00\u822c\u7684\u306a\u958b\u767a\u7528PC\u3067\u306e\u6e2c\u5b9a\u7d50\u679c\u3067\u3042\u308a\u3001\u5b9f\u969b\u306e\u5024\u306f\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u3084\u30b7\u30b9\u30c6\u30e0\u72b6\u614b\u306b\u3088\u308a\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-40\">\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p>\u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u3068\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BitmapResourceOptimizer : IDisposable\n{\n    private readonly ConcurrentDictionary&lt;string, WeakReference&lt;Bitmap&gt;&gt; \n        _bitmapCache = new();\n    private readonly SemaphoreSlim _cacheLock = new(1, 1);\n    private bool _disposed;\n\n    public async Task&lt;Bitmap&gt; GetOrCreateBitmapAsync(string key, \n        Func&lt;Task&lt;Bitmap&gt;&gt; factory)\n    {\n        if (_disposed)\n            throw new ObjectDisposedException(nameof(BitmapResourceOptimizer));\n\n        \/\/ \u30ad\u30e3\u30c3\u30b7\u30e5\u30c1\u30a7\u30c3\u30af\n        if (_bitmapCache.TryGetValue(key, out var weakRef))\n        {\n            if (weakRef.TryGetTarget(out var cachedBitmap))\n            {\n                return cachedBitmap;\n            }\n        }\n\n        await _cacheLock.WaitAsync();\n        try\n        {\n            \/\/ \u30c0\u30d6\u30eb\u30c1\u30a7\u30c3\u30af\n            if (_bitmapCache.TryGetValue(key, out weakRef) &amp;&amp; \n                weakRef.TryGetTarget(out var cachedBitmap))\n            {\n                return cachedBitmap;\n            }\n\n            var newBitmap = await factory();\n            _bitmapCache[key] = new WeakReference&lt;Bitmap&gt;(newBitmap);\n            return newBitmap;\n        }\n        finally\n        {\n            _cacheLock.Release();\n        }\n    }\n\n    public void CleanupUnusedResources()\n    {\n        var keysToRemove = new List&lt;string&gt;();\n\n        foreach (var kvp in _bitmapCache)\n        {\n            if (!kvp.Value.TryGetTarget(out _))\n            {\n                keysToRemove.Add(kvp.Key);\n            }\n        }\n\n        foreach (var key in keysToRemove)\n        {\n            _bitmapCache.TryRemove(key, out _);\n        }\n    }\n\n    public void Dispose()\n    {\n        if (!_disposed)\n        {\n            foreach (var kvp in _bitmapCache)\n            {\n                if (kvp.Value.TryGetTarget(out var bitmap))\n                {\n                    bitmap.Dispose();\n                }\n            }\n\n            _cacheLock.Dispose();\n            _disposed = true;\n        }\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-41\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>WeakReference\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u89e3\u653e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u6700\u9069\u5316\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u4e26\u5217\u51e6\u7406\u306e\u52b9\u679c\u7684\u306a\u6d3b\u7528<\/li>\n\n\n\n<li>\u30c1\u30e3\u30f3\u30af\u30b5\u30a4\u30ba\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u30e9\u30a4\u30f3\u306e\u8003\u616e<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u3068\u6e2c\u5b9a\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53ce\u96c6<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8ffd\u8de1<\/li>\n\n\n\n<li>\u51e6\u7406\u6642\u9593\u306e\u8a08\u6e2c<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306aBitmap\u51e6\u7406\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-42\">\u5b9f\u8df5\u7684\u306aBitmap\u6d3b\u7528\u30b7\u30ca\u30ea\u30aa<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">\u5927\u91cf\u306e\u753b\u50cf\u3092\u6271\u3046\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<p>\u5927\u91cf\u306e\u753b\u50cf\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u30d0\u30c3\u30c1\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class BatchImageProcessor\n{\n    private readonly int _maxConcurrentTasks;\n    private readonly SemaphoreSlim _semaphore;\n\n    public BatchImageProcessor(int maxConcurrentTasks = 5)\n    {\n        _maxConcurrentTasks = maxConcurrentTasks;\n        _semaphore = new SemaphoreSlim(maxConcurrentTasks);\n    }\n\n    public async Task ProcessImagesAsync(\n        string inputDirectory,\n        string outputDirectory,\n        ImageProcessingOptions options)\n    {\n        Directory.CreateDirectory(outputDirectory);\n        var files = Directory.GetFiles(inputDirectory, \"*.jpg\")\n            .Concat(Directory.GetFiles(inputDirectory, \"*.png\"))\n            .ToList();\n\n        var tasks = new List&lt;Task&gt;();\n        var progress = new Progress&lt;ProcessingProgress&gt;(p =&gt;\n        {\n            Console.WriteLine($\"\u51e6\u7406\u9032\u6357: {p.ProcessedCount}\/{files.Count} \" +\n                            $\"({p.ProcessedCount * 100.0 \/ files.Count:F1}%)\");\n        });\n\n        foreach (var file in files)\n        {\n            await _semaphore.WaitAsync();\n\n            tasks.Add(Task.Run(async () =&gt;\n            {\n                try\n                {\n                    await ProcessSingleImageAsync(file, outputDirectory, options);\n                    ((IProgress&lt;ProcessingProgress&gt;)progress).Report(\n                        new ProcessingProgress { ProcessedCount = tasks.Count });\n                }\n                finally\n                {\n                    _semaphore.Release();\n                }\n            }));\n        }\n\n        await Task.WhenAll(tasks);\n    }\n\n    private async Task ProcessSingleImageAsync(\n        string inputPath,\n        string outputDirectory,\n        ImageProcessingOptions options)\n    {\n        var outputPath = Path.Combine(outputDirectory,\n            $\"processed_{Path.GetFileName(inputPath)}\");\n\n        using var bitmap = new Bitmap(inputPath);\n        using var processedBitmap = await ApplyProcessingOptionsAsync(\n            bitmap, \n            options);\n        processedBitmap.Save(outputPath, ImageFormat.Png);\n    }\n\n    private async Task&lt;Bitmap&gt; ApplyProcessingOptionsAsync(\n        Bitmap source,\n        ImageProcessingOptions options)\n    {\n        var result = new Bitmap(source.Width, source.Height);\n\n        using var g = Graphics.FromImage(result);\n        g.InterpolationMode = InterpolationMode.HighQualityBicubic;\n        g.DrawImage(source, 0, 0, result.Width, result.Height);\n\n        if (options.ApplyWatermark)\n        {\n            await ApplyWatermarkAsync(result, options.WatermarkText);\n        }\n\n        if (options.Resize != null)\n        {\n            result = ResizeImage(result, options.Resize.Width, \n                options.Resize.Height);\n        }\n\n        return result;\n    }\n}\n\npublic class ImageProcessingOptions\n{\n    public bool ApplyWatermark { get; set; }\n    public string WatermarkText { get; set; }\n    public ResizeOptions Resize { get; set; }\n}\n\npublic class ResizeOptions\n{\n    public int Width { get; set; }\n    public int Height { get; set; }\n}\n\npublic class ProcessingProgress\n{\n    public int ProcessedCount { get; set; }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-44\">Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306eBitmap\u51e6\u7406<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u753b\u50cf\u51e6\u7406\u30b7\u30ca\u30ea\u30aa\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class WebImageProcessor\n{\n    private readonly IMemoryCache _cache;\n    private readonly string _tempDirectory;\n\n    public WebImageProcessor(IMemoryCache cache)\n    {\n        _cache = cache;\n        _tempDirectory = Path.Combine(Path.GetTempPath(), \"ImageProcessing\");\n        Directory.CreateDirectory(_tempDirectory);\n    }\n\n    public async Task&lt;byte[]&gt; ProcessUploadedImageAsync(\n        IFormFile file,\n        ImageProcessingRequest request)\n    {\n        var tempPath = Path.Combine(_tempDirectory, \n            $\"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}\");\n\n        try\n        {\n            using (var stream = new FileStream(tempPath, FileMode.Create))\n            {\n                await file.CopyToAsync(stream);\n            }\n\n            using var bitmap = new Bitmap(tempPath);\n            using var processedBitmap = await ProcessImageAsync(\n                bitmap, \n                request);\n            using var ms = new MemoryStream();\n\n            processedBitmap.Save(ms, GetImageFormat(request.OutputFormat));\n            return ms.ToArray();\n        }\n        finally\n        {\n            if (File.Exists(tempPath))\n            {\n                File.Delete(tempPath);\n            }\n        }\n    }\n\n    private async Task&lt;Bitmap&gt; ProcessImageAsync(\n        Bitmap source,\n        ImageProcessingRequest request)\n    {\n        var result = new Bitmap(source.Width, source.Height);\n\n        try\n        {\n            using var g = Graphics.FromImage(result);\n            g.InterpolationMode = InterpolationMode.HighQualityBicubic;\n            g.DrawImage(source, 0, 0, result.Width, result.Height);\n\n            if (request.Filters?.Any() == true)\n            {\n                foreach (var filter in request.Filters)\n                {\n                    await ApplyFilterAsync(result, filter);\n                }\n            }\n\n            return result;\n        }\n        catch\n        {\n            result.Dispose();\n            throw;\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-45\">\u753b\u50cf\u5909\u63db\u51e6\u7406\u306e\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u69d8\u3005\u306a\u753b\u50cf\u5909\u63db\u51e6\u7406\u3092\u52b9\u7387\u7684\u306b\u5b9f\u88c5\u3059\u308b\u4f8b\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class ImageTransformationService\n{\n    private readonly ConcurrentDictionary&lt;string, ImageTransformation&gt; \n        _transformations = new();\n\n    public void RegisterTransformation(string name, \n        ImageTransformation transformation)\n    {\n        _transformations[name] = transformation;\n    }\n\n    public async Task&lt;Bitmap&gt; ApplyTransformationsAsync(\n        Bitmap source,\n        IEnumerable&lt;string&gt; transformationNames)\n    {\n        var result = new Bitmap(source);\n\n        foreach (var name in transformationNames)\n        {\n            if (_transformations.TryGetValue(name, out var transformation))\n            {\n                result = await transformation.ApplyAsync(result);\n            }\n        }\n\n        return result;\n    }\n}\n\npublic abstract class ImageTransformation\n{\n    public abstract Task&lt;Bitmap&gt; ApplyAsync(Bitmap source);\n}\n\npublic class ResizeTransformation : ImageTransformation\n{\n    private readonly int _width;\n    private readonly int _height;\n\n    public ResizeTransformation(int width, int height)\n    {\n        _width = width;\n        _height = height;\n    }\n\n    public override Task&lt;Bitmap&gt; ApplyAsync(Bitmap source)\n    {\n        var result = new Bitmap(_width, _height);\n        using var g = Graphics.FromImage(result);\n        g.DrawImage(source, 0, 0, _width, _height);\n        return Task.FromResult(result);\n    }\n}\n\npublic class WatermarkTransformation : ImageTransformation\n{\n    private readonly string _text;\n    private readonly Font _font;\n    private readonly Color _color;\n\n    public WatermarkTransformation(string text, Font font, Color color)\n    {\n        _text = text;\n        _font = font;\n        _color = color;\n    }\n\n    public override Task&lt;Bitmap&gt; ApplyAsync(Bitmap source)\n    {\n        var result = new Bitmap(source);\n        using var g = Graphics.FromImage(result);\n        using var brush = new SolidBrush(_color);\n\n        var size = g.MeasureString(_text, _font);\n        var point = new PointF(\n            (result.Width - size.Width) \/ 2,\n            (result.Height - size.Height) \/ 2);\n\n        g.DrawString(_text, _font, brush, point);\n        return Task.FromResult(result);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">\u5b9f\u8df5\u7684\u306a\u30b7\u30ca\u30ea\u30aa\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u4e26\u5217\u51e6\u7406\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u30d7\u30ed\u30b0\u30ec\u30b9\u5831\u544a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Web\u51e6\u7406\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u7ba1\u7406<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5236\u5fa1<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u51e6\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5909\u63db\u51e6\u7406\n<ul class=\"wp-block-list is-style-sango-list-simple\">\n<li>\u62e1\u5f35\u6027\u306e\u3042\u308b\u8a2d\u8a08<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5b9f\u8df5\u7684\u306aBitmap\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-47\">Bitmap\u30af\u30e9\u30b9\u306e\u307e\u3068\u3081<\/h2>\n\n\n\n<p>C# Bitmap\u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3059\u308b\u969b\u306f\u3001\u9069\u5207\u306a\u30e1\u30e2\u30ea\u7ba1\u7406\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002<br>using\u30b9\u30c6\u30fc\u30c8\u30e1\u30f3\u30c8\u306e\u6d3b\u7528\u3001\u76f4\u63a5\u7684\u306a\u30d4\u30af\u30bb\u30eb\u64cd\u4f5c\u3001\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5\u306a\u3069\u3001\u672c\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u624b\u6cd5\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u5b89\u5b9a\u3057\u305f\u753b\u50cf\u51e6\u7406\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u3053\u306e\u8a18\u4e8b\u306e\u4e3b\u306a\u30dd\u30a4\u30f3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\">\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>GC\u306b\u4f9d\u5b58\u3057\u306a\u3044\u660e\u793a\u7684\u306a\u7ba1\u7406<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\n<ul class=\"wp-block-list\">\n<li>\u76f4\u63a5\u7684\u306a\u30d4\u30af\u30bb\u30eb\u30a2\u30af\u30bb\u30b9<\/li>\n\n\n\n<li>\u4e26\u5217\u51e6\u7406\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc\n<ul class=\"wp-block-list\">\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u5236\u9650\u3078\u306e\u5bfe\u51e6<\/li>\n\n\n\n<li>\u4ee3\u66ff\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u4e92\u63db\u6027\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\n<ul class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u8a08\u6e2c<\/li>\n\n\n\n<li>\u6700\u9069\u5316\u306e\u52b9\u679c\u691c\u8a3c<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div><\/div>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8981\u7d20\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u9ad8\u54c1\u8cea\u306a\u753b\u50cf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":3172,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,61],"tags":[],"class_list":{"0":"post-1683","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-csharp","8":"category-csharp-syntax"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1683"}],"version-history":[{"count":13,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1683\/revisions"}],"predecessor-version":[{"id":3173,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1683\/revisions\/3173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/media\/3172"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}