なんとなく、ふわっと・・

写真と画像処理関係とひとりごとをなんとなく書き溜めていきたい

Candy

2008-01-31 00:22:19 | 写真

直径数ミリの小さな花。 でもなんだか、キャンディーみたいでおいしそう。


吾妻3、つくば市



[DFA Macro 100mmF2.8]


Comment

Y

2008-01-31 00:13:37 | rinkaku




Comment

アルファ値とクリップボード

2008-01-31 00:02:51 | C#(Graphics)

アルファチャネルを持つ画像をクリップボードを経由してやり取りしたい。

普通に SetImage() と GetImage() を使うとうまくいかない。 ちょっとやってみよう。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Clipboard32
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format32bppArgb);

            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillEllipse(Brushes.Crimson, 10, 10, 180, 180);
            g.Dispose();

            g = this.CreateGraphics();
            g.DrawImage(bmp, 10, 10);
            g.Dispose();

            Clipboard.SetImage(bmp);

            bmp.Dispose();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (Clipboard.ContainsImage())
            {
                Bitmap bmp = (Bitmap)Clipboard.GetImage();

                Graphics g = this.CreateGraphics();
                g.DrawImage(bmp, 10, 220);
                g.Dispose();

                bmp.Dispose();
            }
            else
                MessageBox.Show("There is no Image in the Clipboard!");
        }
    }
}


button1 を押してから、button2 を押すと



のようになり、GetImage() でクリップボードからえられるビットマップは、本来、透過している
部分が青になってしまいアルファ値が無視される。 MSPaint に貼り付けると



となり、同じくアルファ値が無視されている。 また、Windows のユーティリティー Clipbrd.exe を
つかって、クリップボードを内容を見てみると



となっており、クリップボードが勝手にレンダリングしてアルファ値を失っている。

WEB を検索してみると、この問題は FAQ であることが分かるが、回避策のコードを探し出せなかった。

そこで、ここを参考にして、内部に Bitmap を抱えたクラスをつくり、そのインスタンスをカスタムフォーマット
としてクリップボードを介してやり取りすることを試してみた。

        private void button3_Click(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format32bppArgb);

            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillEllipse(Brushes.Crimson, 10, 10, 180, 180);
            g.Dispose();

            g = this.CreateGraphics();
            g.DrawImage(bmp, 10, 10);
            g.Dispose();

            Bitmap32 bmp32 = new Bitmap32(bmp);
            Clipboard.SetData("Bitmap32Format", bmp32);

            bmp.Dispose();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (Clipboard.ContainsData("Bitmap32Format"))
            {
                Bitmap32 bmp32 = Clipboard.GetData("Bitmap32Format") as Bitmap32;
                Bitmap bmp = bmp32.Bmp32;

                Graphics g = this.CreateGraphics();
                g.DrawImage(bmp, 10, 220);
                g.Dispose();

                bmp.Dispose();
            }
        }
    }

    [Serializable]
    public class Bitmap32
    {
        private Bitmap bmp = null;

        public Bitmap32(Bitmap bmp32)
        {
            bmp = bmp32;
        }

        ~Bitmap32()
        {
            if (bmp != null) { bmp.Dispose(); }
        }

        public Bitmap Bmp32
        {
            get
            {
                return bmp.Clone() as Bitmap;
            }

            set
            {
                if (bmp != null) { bmp.Dispose(); }
                bmp = value.Clone() as Bitmap;
            }
        }
    }


この結果は



となり、うまくいく。 当然、カスタムフォーマットなので、他のアプリケーションには貼り付けられない。



このようにして、すくなくとも自作の C# アプリケーション間では、アルファ値を保ったままクリップボードを
介したやり取りができるようになった。

さらに進んで、Bitmap オブジェクトそのものをカスタムフォーマットとしてやり取りすることを試した。

        private void button5_Click(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(200, 200, PixelFormat.Format32bppArgb);

            Graphics g = Graphics.FromImage(bmp);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillEllipse(Brushes.Crimson, 10, 10, 180, 180);
            g.Dispose();

            g = this.CreateGraphics();
            g.DrawImage(bmp, 10, 10);
            g.Dispose();

            Clipboard.SetData("Bitmap32Format2", bmp);

            bmp.Dispose();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (Clipboard.ContainsData("Bitmap32Format2"))
            {
                Bitmap bmp = Clipboard.GetData("Bitmap32Format2") as Bitmap;

                Graphics g = this.CreateGraphics();
                g.DrawImage(bmp, 10, 220);
                g.Dispose();

                bmp.Dispose();
            }
        }


結果は、



となり、うまくいく。

この方法では、パレットをもったビットマップの場合でも、その情報を失わずにやり取りできるだろう。


Comment

平沢官衙遺蹟 1

2008-01-30 00:13:42 | 写真

昨年行った、平沢官衙遺蹟を HDR で再び。 見比べるとおもしろい。







平沢、つくば市



[Sigma 17-70mmF2.8-4.5DCMacro]
[HDR]


昨年のは、これ。






Comment

N

2008-01-30 00:03:48 | rinkaku






Comment

2008-01-29 00:10:57 | 写真



妻木、つくば市



[Sigma 17-70mmF2.8-4.5DCMacro]
[HDR]


Comments (3)

R

2008-01-29 00:08:24 | rinkaku






Comment

NotGraffiti4

2008-01-28 00:18:37 | processed





Comment

A

2008-01-28 00:07:34 | rinkaku





Comment

牛久シャトー

2008-01-27 00:16:44 | 写真

所用で牛久に行ったついでに。

















牛久シャトー、牛久市


Photomatix を注文した。


[Sigma 17-70mmF2.8-4.5DCMacro]
[HDR] 3 exprosures with step 1.3 EV.


Comments (4)

K

2008-01-27 00:04:46 | rinkaku




Comment

door

2008-01-26 00:13:03 | 写真



@home



[Sigma 17-70mmF2.8-4.5DCMacro]


Comments (2)

Y

2008-01-26 00:08:21 | rinkaku










Comment

HDR Experiments 5

2008-01-25 00:13:29 | 写真

Photomatix で、トーンマッピングのパラメータを使っていろいろ調整してみた。


吾妻1、つくば市





中央公園、つくば市





つくば花室トンネルのつくば側出口、つくば市


この日は曇天だったのでハイライトとシャドウのコントラストが小さく、HDR のデモとしては
あまりよいものではないかもしれない。晴天で雲の輪郭がはっきりしていて、陰影が濃い
ときこそHDRのありがたみが分かるはずである。 あるいは、薄暗い夕暮れでの夜景
などが効果的かもしれない。


[Sigma 17-70mmF2.8-4.5DCMacro]
[HDR]



Comment

A

2008-01-25 00:05:30 | 写真




Comment