OSDN Git Service

透過PNGのJPEG変換を回避する機能をTwitterPhotoクラスに移動
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 4 Jun 2018 15:21:57 +0000 (00:21 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Tue, 5 Jun 2018 18:20:25 +0000 (03:20 +0900)
OpenTween/Connection/TwitterPhoto.cs
OpenTween/Twitter.cs

index e7f2e40..87fa7e8 100644 (file)
 
 using System;
 using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
 using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
 using OpenTween.Api.DataModel;
+using OpenTween.Setting;
 
 namespace OpenTween.Connection
 {
@@ -102,16 +105,76 @@ namespace OpenTween.Connection
 
         private async Task<long> UploadMediaItem(IMediaItem mediaItem)
         {
-            var mediaId = await this.tw.UploadMedia(mediaItem)
-                .ConfigureAwait(false);
-
-            if (!string.IsNullOrEmpty(mediaItem.AltText))
+            async Task<long> UploadInternal(IMediaItem media)
             {
-                await this.tw.Api.MediaMetadataCreate(mediaId, mediaItem.AltText)
+                var mediaId = await this.tw.UploadMedia(media)
                     .ConfigureAwait(false);
+
+                if (!string.IsNullOrEmpty(media.AltText))
+                {
+                    await this.tw.Api.MediaMetadataCreate(mediaId, media.AltText)
+                        .ConfigureAwait(false);
+                }
+
+                return mediaId;
             }
 
-            return mediaId;
+            using (var origImage = mediaItem.CreateImage())
+            {
+                if (SettingManager.Common.AlphaPNGWorkaround && this.AddAlphaChannelIfNeeded(origImage.Image, out var newImage))
+                {
+                    using (var newMediaItem = new MemoryImageMediaItem(newImage))
+                    {
+                        newMediaItem.AltText = mediaItem.AltText;
+                        return await UploadInternal(newMediaItem);
+                    }
+                }
+                else
+                {
+                    return await UploadInternal(mediaItem);
+                }
+            }
+        }
+
+        /// <summary>
+        /// pic.twitter.com アップロード時に JPEG への変換を回避するための加工を行う
+        /// </summary>
+        /// <remarks>
+        /// pic.twitter.com へのアップロード時に、アルファチャンネルを持たない PNG 画像が
+        /// JPEG 形式に変換され画質が低下する問題を回避します。
+        /// PNG 以外の画像や、すでにアルファチャンネルを持つ PNG 画像に対しては何もしません。
+        /// </remarks>
+        /// <returns>加工が行われた場合は true、そうでない場合は false</returns>
+        private bool AddAlphaChannelIfNeeded(Image origImage, out MemoryImage newImage)
+        {
+            newImage = null;
+
+            // PNG 画像以外に対しては何もしない
+            if (origImage.RawFormat.Guid != ImageFormat.Png.Guid)
+                return false;
+
+            using (var bitmap = new Bitmap(origImage))
+            {
+                // アルファ値が 255 以外のピクセルが含まれていた場合は何もしない
+                foreach (var x in Enumerable.Range(0, bitmap.Width))
+                {
+                    foreach (var y in Enumerable.Range(0, bitmap.Height))
+                    {
+                        if (bitmap.GetPixel(x, y).A != 255)
+                            return false;
+                    }
+                }
+
+                // 左上の 1px だけアルファ値を 254 にする
+                var pixel = bitmap.GetPixel(0, 0);
+                var newPixel = Color.FromArgb(pixel.A - 1, pixel.R, pixel.G, pixel.B);
+                bitmap.SetPixel(0, 0, newPixel);
+
+                // MemoryImage 作成時に画像はコピーされるため、この後 bitmap は破棄しても問題ない
+                newImage = MemoryImage.CopyFromImage(bitmap);
+
+                return true;
+            }
         }
     }
 }
index 41cbe37..a4337c6 100644 (file)
@@ -44,13 +44,11 @@ using System.Xml.XPath;
 using System;
 using System.Reflection;
 using System.Collections.Generic;
-using System.Drawing;
 using System.Windows.Forms;
 using OpenTween.Api;
 using OpenTween.Api.DataModel;
 using OpenTween.Connection;
 using OpenTween.Models;
-using System.Drawing.Imaging;
 using OpenTween.Setting;
 
 namespace OpenTween
@@ -303,31 +301,12 @@ namespace OpenTween
             this.previousStatusId = status.Id;
         }
 
-        public Task<long> UploadMedia(IMediaItem item)
-            => this.UploadMedia(item, SettingManager.Common.AlphaPNGWorkaround);
-
-        public async Task<long> UploadMedia(IMediaItem item, bool alphaPNGWorkaround)
+        public async Task<long> UploadMedia(IMediaItem item)
         {
             this.CheckAccountState();
 
-            LazyJson<TwitterUploadMediaResult> response;
-
-            using (var origImage = item.CreateImage())
-            {
-                if (alphaPNGWorkaround && this.AddAlphaChannelIfNeeded(origImage.Image, out var newImage))
-                {
-                    using (var newMediaItem = new MemoryImageMediaItem(newImage))
-                    {
-                        response = await this.Api.MediaUpload(newMediaItem)
-                            .ConfigureAwait(false);
-                    }
-                }
-                else
-                {
-                    response = await this.Api.MediaUpload(item)
-                        .ConfigureAwait(false);
-                }
-            }
+            var response = await this.Api.MediaUpload(item)
+                .ConfigureAwait(false);
 
             var media = await response.LoadJsonAsync()
                 .ConfigureAwait(false);
@@ -335,47 +314,6 @@ namespace OpenTween
             return media.MediaId;
         }
 
-        /// <summary>
-        /// pic.twitter.com アップロード時に JPEG への変換を回避するための加工を行う
-        /// </summary>
-        /// <remarks>
-        /// pic.twitter.com へのアップロード時に、アルファチャンネルを持たない PNG 画像が
-        /// JPEG 形式に変換され画質が低下する問題を回避します。
-        /// PNG 以外の画像や、すでにアルファチャンネルを持つ PNG 画像に対しては何もしません。
-        /// </remarks>
-        /// <returns>加工が行われた場合は true、そうでない場合は false</returns>
-        private bool AddAlphaChannelIfNeeded(Image origImage, out MemoryImage newImage)
-        {
-            newImage = null;
-
-            // PNG 画像以外に対しては何もしない
-            if (origImage.RawFormat.Guid != ImageFormat.Png.Guid)
-                return false;
-
-            using (var bitmap = new Bitmap(origImage))
-            {
-                // アルファ値が 255 以外のピクセルが含まれていた場合は何もしない
-                foreach (var x in Enumerable.Range(0, bitmap.Width))
-                {
-                    foreach (var y in Enumerable.Range(0, bitmap.Height))
-                    {
-                        if (bitmap.GetPixel(x, y).A != 255)
-                            return false;
-                    }
-                }
-
-                // 左上の 1px だけアルファ値を 254 にする
-                var pixel = bitmap.GetPixel(0, 0);
-                var newPixel = Color.FromArgb(pixel.A - 1, pixel.R, pixel.G, pixel.B);
-                bitmap.SetPixel(0, 0, newPixel);
-
-                // MemoryImage 作成時に画像はコピーされるため、この後 bitmap は破棄しても問題ない
-                newImage = MemoryImage.CopyFromImage(bitmap);
-
-                return true;
-            }
-        }
-
         public async Task SendDirectMessage(string postStr)
         {
             this.CheckAccountState();