크리에이티브 커먼즈 라이선스
Creative Commons License

[소셜 웹 마케팅]
SNS(Social Network Service)란 한마디로 살마들이 사는 곳입니다. 인터넷을 통한 간접적인 만남 정도로 생각하면 오산이죠. 비록 가상의 공간이긴 해도 사람들은 서로의 글과 사진을 통해 소통하고 현실 세계 못지않은 관계를 맺으면서 SNS를 자신의 일부로 여기고 있습니다. 게다가 더 이상 '입소문'수준이라고 볼 수 없는 폭발적인 전파력과 어떤 상대와도 직접 소통할 수 있다는 장점 덕분에 마케터들은 일찌캄치 SNS를 눈여겨봤죠. 그 결과로 생겨난 것이 바로 네트워크를 활용한 소셜 웹 마케팅이라고 할 수 있겠네요. 이제 기업이든 개인이든, 생산자 혹은 판매자는 언제든지 소비자와 직접 대화할 수 있습니다.

[소비자와의 직접 소통]
요즘 한창 인기를 끌고 있는 SNS 트위터에서는 유명 기업인들을 꽤 쉽게 만날 수 있습니다. 팔로우(Follow: 상대의 트윗을 구독함)만 하면 되거든요. 드림위즈의 CEO 이찬진씨는 한국 IT업계 소식을 발 빠르게 전하고, KT의 표현명 사장은 신제품 소식부터 고객의 불만사항까지 직접 나서서 접수하더군요. 두산의 박용만 회장은 사모님께 혼나가며 꽐라되는 사생활까지 기꺼이 공개해서 인기폭발이기도 하고요. 팔로워 숫자가 만 단위를 훌쩍 넘기는 분들을 보면 마케팅에 문외한인 저라도 얼른 따라하겠네요. 어쨋거나 많은 기업에서 공식 트위터를 통해 홍보는 물론이고 소비자의 의견을 직접 받고 있습니다.  

[소셜 웹을 통한 혜택]
소셜 웹 마케팅이 발달하면 역시 소비자에게도 이익이 많습니다. 우리나라의 대표적인 SNS쇼핑몰인 '티켓몬스터'는 하루에 한 가지 품목을 판매합니다. 이 원어데이 방식에 특별한 SNS식 홍보가 결합돼 있죠. 레스토랑, 카페, 바, 스파, 뷰피, 공연 등 다양한 품목 중에 오늘의 상품이 결정되면 회언들은 이 상품을 열심히 퍼 나릅니다. 문자, 트위터, 페이스북, 미니홈피, 미투데이, 이메일 등 사람들이 많이 쓰는 SNS 서비스는 대충 다 가능하다고 보시면 되죠. 그래서 이 상품을 구매하겠다는 사람이 목표치에 이르면 무려 50%나 할인된 가격에 상품을 사는 겁니다. 10년 전엔 입소문을 통해 공동구매를 했다면, 요즘은 SNS를 통해 한다고 보시면 되겠습니다.

저작자 표시
신고
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License

Exporting canvas to PNG image

public void ExportToPng(Uri path, Canvas surface)
{
  if (path == null) return;

  // Save current canvas transform
  Transform transform = surface.LayoutTransform;
  // reset current transform (in case it is scaled or rotated)
  surface.LayoutTransform = null;

  // Get the size of canvas
  Size size = new Size(surface.Width, surface.Height);
  // Measure and arrange the surface
  // VERY IMPORTANT
  surface.Measure(size);
  surface.Arrange(new Rect(size));

  // Create a render bitmap and push the surface to it
  RenderTargetBitmap renderBitmap =
    new RenderTargetBitmap(
      (int)size.Width,
      (int)size.Height,
      96d,
      96d,
      PixelFormats.Pbgra32);
  renderBitmap.Render(surface);

  // Create a file stream for saving image
  using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create))
  {
    // Use png encoder for our data
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    // push the rendered bitmap to it
    encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
    // save the data to the stream
    encoder.Save(outStream);
  }

  // Restore previously saved layout
  surface.LayoutTransform = transform;
}

I’ve again tried to make the code self-explaining. You can try to use different encoders for saving the data so it’s up to you to look through what ones are available. The main trouble many guys come across is blank images as the canvas output or saving canvas programmatically without visualizing it. The key is measuring and arranging the surface before pushing it to render bitmap. As render bitmap does nothing with measuring and arranging elements in this case, this should be regarded mandatory for you. And of course you should remember the zooming/scaling and rotation matrices ;) the layout transformations will also be saved to the image so you should take care of that manually. In my case I cache the LatoutTransform and reset the original value right before measuring canvas.

Paying more attention you can see that bitmap encoder accepts a Visual so canvas is not the only element that can be passed ;) Going down the inheritance tree it is convenient to use the FrameworkElement or pure Visual. FrameworkElement contains Width and Height properties used by canvas.

Default set references provided by WPF application template is quite enough to implement this method. Of course you’ll have to resolve "using" section ;)

Exporting canvas to XPS document

Actually this was the first I’ve started implementing for my application. I like XPS format very much because it is easy to maintain and integrate. Here’s the quick snippet of exporting your canvas to XPS

public void Export(Uri path, Canvas surface)
{
  if (path == null) return;

  // Save current canvas transorm
  Transform transform = surface.LayoutTransform;
  // Temporarily reset the layout transform before saving
  surface.LayoutTransform = null;

  // Get the size of the canvas
  Size size = new Size(surface.Width, surface.Height);
  // Measure and arrange elements
  surface.Measure(size);
  surface.Arrange(new Rect(size));

  // Open new package
  Package package = Package.Open(path.LocalPath, FileMode.Create);
  // Create new xps document based on the package opened
  XpsDocument doc = new XpsDocument(package);
  // Create an instance of XpsDocumentWriter for the document
  XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);
  // Write the canvas (as Visual) to the document
  writer.Write(surface);
  // Close document
  doc.Close();
  // Close package
  package.Close();

  // Restore previously saved layout
  surface.LayoutTransform = transform;
}

You will need two additional assemblies to be referenced from the GAC: "ReachFramework.dll" and "System.Printing.dll". Again I’d advice you to backup the original layout transformation regardless it’s state before processing canvas. You should definitely read more details towards System.IO.Packaging and XPS documents. For those who doesn’t know yet the XPS document is presented by zip container for some xml, fonts and binary data like images etc. You can freely rename XPS to ZIP, unpack it and look inside for better understanding when you’ll be looking though MSDN articles towards it.

I was really pleased to find out that 10 or 20 of my duplicated elements having the same image with content template loaded from the separate assembly wasn’t cloned. I had only one image in the XPS for each distinct type of element so the archive size was extremely small for my diagram.

Exporting canvas to the XAML

I’ll give you the most stupid sample that can be found everywhere

public void Export(Uri path, Canvas surface)
    {
      if (path == null) return;
      if (surface == null) return;

      string xaml = XamlWriter.Save(surface);
      File.WriteAllText(path.LocalPath, xaml);
    }

You get the xaml presentation of your canvas that can be later loaded with XamlReader. Be prepared to cuss MS guys a lot because it is rather difficult to adopt any application load anything except simple xamls into your canvas :) The worst thing is that it doesn’t support bindings/multibindings so you’ll have to resolve them somehow on document loading. The same is for events and there’s a list of things not supported that can be easily found at MSDN shipped with Visual Studio. I’ve looked through the Internet to find any good solution but there’s nothing I liked. Guess if it becomes a hot topic (and I’m sure it will become soon) a lot of good overrides will appear. I’m doing my own implementation but it’s in the early stage and cannot be brought to public.


저작자 표시
신고

'Study > WPF' 카테고리의 다른 글

[WPF_Program: Window Desktop Interface]  (3) 2011.02.12
[WPF: insert XAML into RichTextBox]  (0) 2010.12.20
[WPF: Diagramming. Saving you canvas to image]  (0) 2010.10.20
[WPF : Data Binding]  (0) 2010.07.28
Trackback 0 | Comment 0
크리에이티브 커먼즈 라이선스
Creative Commons License

저작자 표시
신고

'외부활동 > SSM' 카테고리의 다른 글

[삼성소프트웨어 멤버십: 신입회원 모집]  (2) 2010.10.16
[삼성 S/W 멤버쉽 합격]  (0) 2010.07.18
Trackback 0 | Comments 2

강군v's Blog is powered by Daum & tistory

 

티스토리 툴바