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(); }
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 { } }
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; } }
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(); }
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 { } }
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; }
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); }
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; }
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; }
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; }
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; }