Exemple #1
0
        public frmPreview(ImageSet imageSet)
        {
            this.m_imageSet = imageSet;
            this.m_imgSize = imageSet.Image.Size;

            InitializeComponent();
            this.Icon = TiX.Properties.Resources.TiX;
            this.Text = String.Format("미리보기 : {0} x {1} ({2:##0.0} %) : {3}", this.m_imgSize.Width, this.m_imgSize.Height, imageSet.Ratio, Helper.ToCapString(imageSet.RawStream.Length));

            this.m_client = this.ClientRectangle;
            this.CalcMaxLocation();
            this.CheckPosition();
        }
Exemple #2
0
        private void UploadImage(ImageSet imageSet)
        {
            try
            {
                if (imageSet.Status == ImageSet.Statues.None)
                    imageSet.IsLoading.WaitOne();

                if (imageSet.Status == ImageSet.Statues.Error)
                    return;

                var boundary  = Helper.CreateString();

                var req = TiXMain.Twitter.CreateWebRequest("POST", "https://upload.twitter.com/1.1/media/upload.json");
                req.ContentType = "multipart/form-data; charset=utf-8; boundary=" + boundary;
                boundary = "--" + boundary;

                var stream = req.GetRequestStream();
                using (var writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true, NewLine = "\r\n" })
                {
                    writer.WriteLine(boundary);
                    writer.WriteLine("Content-Type: application/octet-stream");
                    writer.WriteLine("Content-Disposition: form-data; name=\"media\"; filename=\"img{0}\"", imageSet.Extension);
                    writer.WriteLine();
                    imageSet.RawStream.Position = 0;
                    imageSet.RawStream.CopyTo(stream);
                    writer.WriteLine();
                    writer.WriteLine(boundary + "--");
                }

                using (var res = req.GetResponse())
                using (var reader = new StreamReader(res.GetResponseStream()))
                    imageSet.TwitterMediaId = regMedia.Match(reader.ReadToEnd()).Groups[1].Value;
            }
            catch
            {
            }
        }
Exemple #3
0
        private void SetThumbnailByImageSet(ImageSet sender)
        {
            switch (sender.Status)
            {
            case ImageSet.Statues.None:
                this.picImage.Image = Properties.Resources.refresh;
                break;

            case ImageSet.Statues.Error:
                this.picImage.Image = Properties.Resources.error;
                break;

            case ImageSet.Statues.Success:
                this.picImage.Image = sender.Thumbnail;
                break;
            }
        }
Exemple #4
0
        private void CheckAllImageLoaded(ImageSet sender)
        {
            for (int i = 0; i < this.m_uploadRange; ++i)
                if (this.m_ic[this.m_uploadIndex + i].Status == ImageSet.Statues.None)
                    return;

            this.ajax.Stop();

            if (this.AutoStart && (!Settings.UniformityText || this.m_uploadIndex > 0))
            {
                // 자동 트윗이거나,
                // 내용 통일이 아니거나,
                // 내용 통일이고 index 가 0 이 아닐때 자동트윗
                this.Tweet();
            }
            else if (Settings.UniformityText && this.m_uploadIndex > 0)
                this.Tweet();

            this.txtText.Focus();
        }
Exemple #5
0
        private void bgwTweet_DoWork(object sender, DoWorkEventArgs e)
        {
            int i;

            var lst = new ImageSet[this.m_uploadRange];
            for (i = 0; i < this.m_uploadRange; ++i)
                lst[i] = this.m_ic[this.m_uploadIndex + i];

            var option = new ParallelOptions();
            option.MaxDegreeOfParallelism = 4;
            Parallel.ForEach(lst, option, UploadImage);

            string media_ids;
            {
                var sb = new StringBuilder(32);

                int k = 0;
                for (i = 0; i < this.m_uploadRange; ++i)
                {
                    if (lst[i].TwitterMediaId != null)
                    {
                        k++;
                        sb.AppendFormat(lst[i].TwitterMediaId);
                        sb.AppendFormat(",");
                    }
                }

                if (k == 0)
                {
                    e.Result = 0;
                    return;
                }

                sb.Remove(sb.Length - 1, 1);

                media_ids = sb.ToString();
            }
            var obj = new { status = (string)e.Argument, media_ids = media_ids, in_reply_to_status_id = this.InReplyToStatusId };

            try
            {
                var buff = Encoding.UTF8.GetBytes(OAuth.ToString(obj));
                var req = TiXMain.Twitter.CreateWebRequest("POST", "https://api.twitter.com/1.1/statuses/update.json", obj);
                req.GetRequestStream().Write(buff, 0, buff.Length);

                using (var res = req.GetResponse())
                { }

                e.Result = 0;
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    using (var res = ex.Response)
                    using (var stream = res.GetResponseStream())
                    using (var reader = new StreamReader(stream))
                    {
                        var m = regError.Match(reader.ReadToEnd());
                        if (m.Success)
                            e.Result = m.Groups[1].Value;
                    }
                }
            }
            catch
            {
            }
        }
Exemple #6
0
        public static bool Resize(ImageSet imageSet)
        {
            var szBefore = imageSet.Image.Size;
            try
            {
                ResizeImagePrivate(imageSet);
            }
            catch
            {
                return false;
            }
            var szAfter = imageSet.Image.Size;

            imageSet.Ratio = ((double)szAfter.Width * szAfter.Height) / (szBefore.Width * szBefore.Height) * 100d;

            // Thumbnail
            var ratio = Math.Min(64d / imageSet.Image.Width, 64d / imageSet.Image.Height);
            var newWidth  = (int)(imageSet.Image.Width  * ratio);
            var newHeight = (int)(imageSet.Image.Height * ratio);

            imageSet.Thumbnail = ResizeBySize(imageSet.Image, newWidth, newHeight, PixelFormat.Format32bppArgb);

            return true;
        }
Exemple #7
0
        private static void ResizeImagePrivate(ImageSet imageSet)
        {
            var ext = GetExtension(imageSet);
            if (ext == Extension.Gif)
            {
                try
                {
                    imageSet.GifFrames = new GifFrames(imageSet.Image);
                }
                catch
                {
                }

                // 프레임이 포함된 애니메이션일 경우
                if (imageSet.GifFrames != null)
                {
                    if (imageSet.GifFrames.Count > 1)
                    {
                        ResizeGif(imageSet);
                        return;
                    }
                    else
                    {
                        imageSet.GifFrames.Dispose();
                        imageSet.GifFrames = null;
                    }
                }
            }

            // 크기가 일정 기준 이하면 리사이징을 하지 않고 넘어간다
            if (0 < imageSet.RawStream.Length && imageSet.RawStream.Length <= ImgMaxSize)
                return;

            bool containsAlpha;
            imageSet.Image = ConvertToBitmap(imageSet.Image, out containsAlpha);

            ImageCodecInfo codec;
            EncoderParameters param;
            double pixels;

            if (ext == Extension.Jpg || !containsAlpha)
            {
                imageSet.Extension = ".jpg";
                codec = JpgCodec;
                param = JpgParam;
                pixels = ImgMaxSize * JpgCompressionRatio;
            }
            else
            {
                imageSet.Extension = ".png";
                codec = PngCodec;
                param = PngParam;
                pixels = ImgMaxSize * PngCompressionRatio * 4;
            }

            if (imageSet.RawStream.Length == 0)
            {
                imageSet.Image.Save(imageSet.RawStream, codec, param);

                if (0 < imageSet.RawStream.Length && imageSet.RawStream.Length <= ImgMaxSize)
                    return;
            }

            Resize(imageSet, codec, param, pixels);
        }
Exemple #8
0
        private static void ResizeGif(ImageSet imageSet)
        {
            int i;
            int w = imageSet.Image.Width;
            int h = imageSet.Image.Height;
            bool requireResize = imageSet.RawStream.Length > GifMaxSize;

            // Resolution should be <= 1280x1080 (width x height)
            if (w > 1280 || h > 1080)
            {
                requireResize = true;

                var ratio = Math.Min(1280d / imageSet.Image.Width, 1080d / imageSet.Image.Height);
                w  = (int)(imageSet.Image.Width  * ratio);
                h = (int)(imageSet.Image.Height * ratio);
            }

            // Number of frames <= 350
            while (imageSet.GifFrames.Count > 350)
            {
                requireResize = true;

                imageSet.GifFrames[350].Image.Dispose();
                imageSet.GifFrames.RemoveAt(350);
            }

            // Number of pixels (width * height * num_frames) <= 300,000,000
            {
                double pixels = w * h * imageSet.GifFrames.Count;
                if (pixels > 300000000)
                {
                    requireResize = true;

                    int nw, nh;
                    GetSizeFromPixels(300000000d / imageSet.GifFrames.Count, w, h, out nw, out nh);

                    w = nw;
                    h = nh;
                }
            }

            Bitmap[] image = new Bitmap[imageSet.GifFrames.Count];
            while (requireResize && imageSet.RawStream.Length > GifMaxSize)
            {
                w = (int)(w * 0.9d);
                h = (int)(h * 0.9d);

                for (i = 0; i < imageSet.GifFrames.Count; ++i)
                {
                    if (image[i] != null)
                        image[i].Dispose();
                    image[i] = ResizeBySize(imageSet.GifFrames[i].Image, w, h);
                }

                imageSet.RawStream.SetLength(0);

                using (var newImage = image[0].Clone() as Bitmap)
                {
                    CopyProperties(imageSet.Image, newImage);

                    for (i = 0; i < imageSet.GifFrames.Count; ++i)
                    {
                        if (i == 0)
                            newImage.Save(imageSet.RawStream, GifCodec, GifParamFrame);
                        else
                            newImage.SaveAdd(image[i], GifParamDimention);
                    }
                    newImage.SaveAdd(GifParamFlush);
                }
            }
            if (requireResize)
            {
                for (i = 0; i < imageSet.GifFrames.Count; ++i)
                {
                    imageSet.GifFrames[i].Image.Dispose();
                    imageSet.GifFrames[i].Image = image[i];
                }
            }

            imageSet.Image.Dispose();
            imageSet.Image = imageSet.GifFrames[0].Image;
            imageSet.RawStream.Position = 0;
        }
Exemple #9
0
        private static Bitmap ResizeAndSave(ImageSet imageSet, ImageCodecInfo codec, EncoderParameters param, int w, int h)
        {
            var newImage = ResizeBySize(imageSet.Image, w, h);
            imageSet.RawStream.SetLength(0);
            newImage.Save(imageSet.RawStream, codec, param);

            return newImage;
        }
Exemple #10
0
        private static void Resize(ImageSet imageSet, ImageCodecInfo codec, EncoderParameters param, double size)
        {
            int w, h;

            GetSizeFromPixels(size, imageSet.Image.Width, imageSet.Image.Height, out w, out h);

            Bitmap newImage = null;
            do
            {
                if (newImage != null)
                    newImage.Dispose();

                newImage = ResizeAndSave(imageSet, codec, param, w, h);

                w = (int)(w * 0.9f);
                h = (int)(h * 0.9f);
            } while (imageSet.RawStream.Length > ImgMaxSize);

            imageSet.Image.Dispose();
            imageSet.Image = newImage;
        }
Exemple #11
0
        private static Extension GetExtension(ImageSet image)
        {
            var guid = image.Image.RawFormat.Guid;

            if (guid == ImageFormat.Gif.Guid)
            {
                image.Extension = ".gif";
                return Extension.Gif;
            }

            if (guid == ImageFormat.Jpeg.Guid)
            {
                image.Extension = ".jpg";
                return Extension.Jpg;
            }

            image.Extension = ".png";
            return Extension.Png;
        }