2017-03-27 3 views
1

私はアンドロイドでカラーピッカーを作ろうとしていますが、私が間違ったことをしていると分かりません。私はImageViewを持っており、このイメージをビットマップにデコードしています。ビットマップではGetPixel()メソッドを使用していますが、私はこの時点で何か間違っていると思います。誰かが私が間違っていることを伝えることはできますか?ここで私が使用しているイメージがある:Xamarinがビットマップから間違った色を取得しています

enter image description here

ので、多分解像度が問題であり、私は(720x1280解像度、アンドロイド5.1.1)Z1コンパクトでそれをテストしていて、画像が750×300でありますか?

namespace ImageViewTest 
    { 
     [Activity(Label = "ImageView", MainLauncher = true, Icon = "@drawable/icon")] 
     public class MainActivity : Activity 
     { 
      protected override void OnCreate(Bundle bundle) 
      { 
       base.OnCreate(bundle); 

       int colorPickerWidth = 750, colorPickerHeight = 300, colorBaseHeight = 1184, colorBaseWidth = 720; 
       float colorPickerScaleWidth = 720/colorBaseWidth, colorPickerScaleHeight = 1184/colorBaseHeight; 

       // Set our view from the "main" layout resource 
       SetContentView(Resource.Layout.Main); 
       RelativeLayout rl = FindViewById<RelativeLayout>(Resource.Id.relative); 
       ImageView colorPanel = new ImageView(this); 

       colorPanel.SetImageResource(Resource.Drawable.colorPicker); 
       colorPanel.LayoutParameters = new ViewGroup.LayoutParams(colorPickerWidth, colorPickerHeight); 
       Bitmap bitmap = BitmapFactory.DecodeResource(this.Resources, Resource.Drawable.colorPicker); 
       bitmap = Bitmap.CreateBitmap(bitmap); 

       colorPanel.SetImageBitmap(bitmap); 
       colorPanel.Touch += (object sender, TouchEventArgs e) => 
       { 
        Console.WriteLine("X:" + (int)e.Event.GetX()); 
        Console.WriteLine("Y:" + (int)e.Event.GetY()); 
        try 
        { 
         Color pixel = new Color(bitmap.GetPixel((int)e.Event.GetX(), (int)e.Event.GetY())); 
         int red = Color.GetRedComponent(pixel), green = Color.GetGreenComponent(pixel), blue = Color.GetBlueComponent(pixel); 
         Console.WriteLine("R:" + red + " G:" + green + " B:" + blue); 
        } 
        catch 
        { 

        } 
       }; 

       rl.AddView(colorPanel); 
      } 
     } 
    } 
+0

どちらの色がお好みですか?どの色が得られますか?数字を教えてください! X、Yで始まる – greenapps

答えて

0

あなたが拡張することができ、タッチX/YはImageViewのサイズと元の描画可能/ビットマップ(固有値)、現在の境界によってX/Yのオフセットに基づいて座標とそのはあなたを与える必要がありますタッチの座標がビットマップに変換されます(ビットマップに他のタイプの翻訳やエフェクトを適用している場合を除く)。

var drawable = (BitmapDrawable)colorPanel.Drawable; 
colorPanel.Touch += (object sender, Android.Views.View.TouchEventArgs e) => 
{ 
    var intrinsicScaleX = (float)drawable.IntrinsicWidth/(float)drawable.Bounds.Width(); 
    var intrinsicScaleY = (float)drawable.IntrinsicHeight/(float)drawable.Bounds.Height(); 
    var viewScaleX = (float)drawable.IntrinsicWidth/(float)colorPanel.Width; 
    var viewScaleY = (float)drawable.IntrinsicHeight/(float)colorPanel.Height; 
    var x = (e.Event.GetX() - drawable.Bounds.Left) * intrinsicScaleX * viewScaleX; 
    var y = (e.Event.GetY() - drawable.Bounds.Top) * intrinsicScaleY * viewScaleY; 
    var pixel = drawable.Bitmap.GetPixel((int)x, (int)y); 
    Console.WriteLine($"{viewScaleX}:{viewScaleY}::{e.Event.GetX()}:{e.Event.GetY()}:{x}:{y}:{Color.GetRedComponent(pixel)}:{Color.GetGreenComponent(pixel)}:{Color.GetBlueComponent(pixel)}"); 
}; 
+0

ありがとう!それは仕事です:)私は "x、y"座標をスケールしなければならないということは考えていませんでした。私はそれがイメージの大きさに関係していると確信していました。 – Salin

関連する問題