2013-01-01 65 views
0

我發現了一些在線圖像搜索/識別的代碼,因爲我幾乎不知道任何csharp,我把它放在課堂上並構建它。現在,當我嘗試從vb項目訪問它時,它不顯示。即使它被引用後,我實際上也無法訪問它。我在說因爲這些函數沒有共享,而且據我所知,C#中的「靜態」與「vb.net中的共享」相同,儘管在添加它的時候我得到了錯誤,任何人都可以確認這是爲什麼我可以「呢??相同的T接去時,我引用從我的vb.net項目這個proejct我不能既訪問類。任何人都可以告訴我爲什麼我無法從其項目之外訪問此代碼?

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.IO; 


namespace ImageRecognition 
{ 
class LockedFastImage 
{ 
    private Bitmap image; 
    private byte[] rgbValues; 
    private System.Drawing.Imaging.BitmapData bmpData; 

    private IntPtr ptr; 
    private int bytes; 

    public LockedFastImage(Bitmap image) 
    { 
     this.image = image; 
     Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); 
     bmpData = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, image.PixelFormat); 

     ptr = bmpData.Scan0; 
     bytes = Math.Abs(bmpData.Stride) * image.Height; 
     rgbValues = new byte[bytes]; 
     System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); 
    } 

    ~LockedFastImage() 
    { 
     // Try to unlock the bits. Who cares if it dont work... 
     try 
     { 
      image.UnlockBits(bmpData); 
     } 
     catch { } 
    } 

    /// <summary> 
    /// Returns or sets a pixel of the image. 
    /// </summary> 
    /// <param name="x">x parameter of the pixel</param> 
    /// <param name="y">y parameter of the pixel</param> 
    public Color this[int x, int y] 
    { 
     get 
     { 
      int index = (x + (y * image.Width)) * 4; 
      return Color.FromArgb(rgbValues[index + 3], rgbValues[index + 2], rgbValues[index + 1], rgbValues[index]); 
     } 

     set 
     { 
      int index = (x + (y * image.Width)) * 4; 
      rgbValues[index] = value.B; 
      rgbValues[index + 1] = value.G; 
      rgbValues[index + 2] = value.R; 
      rgbValues[index + 3] = value.A; 
     } 
    } 

    /// <summary> 
    /// Width of the image. 
    /// </summary> 
    public int Width 
    { 
     get 
     { 
      return image.Width; 
     } 
    } 

    /// <summary> 
    /// Height of the image. 
    /// </summary> 
    public int Height 
    { 
     get 
     { 
      return image.Height; 
     } 
    } 

    /// <summary> 
    /// Returns the modified Bitmap. 
    /// </summary> 
    public Bitmap asBitmap() 
    { 
     System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes); 
     return image; 
    } 
} 

class ImageChecker 
{ 

    private LockedFastImage big_image; 
    private LockedFastImage small_image; 
    /// <summary> 
    /// The time needed for last operation. 
    /// </summary> 
    public TimeSpan time_needed = new TimeSpan(); 

    /// <summary> 
    /// Error return value. 
    /// </summary> 
    static public Point CHECKFAILED = new Point(-1, -1); 

    /// <summary> 
    /// Constructor of the ImageChecker 
    /// </summary> 
    /// <param name="big_image">The image containing the small image.</param> 
    /// <param name="small_image">The image located in the big image.</param> 
    public ImageChecker(Bitmap big_image, Bitmap small_image) 
    { 
     this.big_image = new LockedFastImage(big_image); 
     this.small_image = new LockedFastImage(small_image); 
    } 

    /// <summary> 
    /// Returns the location of the small image in the big image. Returns CHECKFAILED if not found. 
    /// </summary> 
    /// <param name="x_speedUp">speeding up at x achsis.</param> 
    /// <param name="y_speedUp">speeding up at y achsis.</param> 
    /// <param name="begin_percent_x">Reduces the search rect. 0 - 100</param> 
    /// <param name="end_percent_x">Reduces the search rect. 0 - 100</param> 
    /// <param name="begin_percent_x">Reduces the search rect. 0 - 100</param> 
    /// <param name="end_percent_y">Reduces the search rect. 0 - 100</param> 
    public Point bigContainsSmall(int x_speedUp = 1, int y_speedUp = 1, int begin_percent_x = 0, int end_percent_x = 100, int begin_percent_y = 0, int end_percent_y = 100) 
    { 
     /* 
     * SPEEDUP PARAMETER 
     * It might be enough to check each second or third pixel in the small picture. 
     * However... In most cases it would be enough to check 4 pixels of the small image for diablo porposes. 
     * */ 

     /* 
     * BEGIN, END PARAMETER 
     * In most cases we know where the image is located, for this we have the begin and end paramenters. 
     * */ 

     DateTime begin = DateTime.Now; 

     if (x_speedUp < 1) x_speedUp = 1; 
     if (y_speedUp < 1) y_speedUp = 1; 
     if (begin_percent_x < 0 || begin_percent_x > 100) begin_percent_x = 0; 
     if (begin_percent_y < 0 || begin_percent_y > 100) begin_percent_y = 0; 
     if (end_percent_x < 0 || end_percent_x > 100) end_percent_x = 100; 
     if (end_percent_y < 0 || end_percent_y > 100) end_percent_y = 100; 

     int x_start = (int)((double)big_image.Width * ((double)begin_percent_x/100.0)); 
     int x_end = (int)((double)big_image.Width * ((double)end_percent_x/100.0)); 
     int y_start = (int)((double)big_image.Height * ((double)begin_percent_y/100.0)); 
     int y_end = (int)((double)big_image.Height * ((double)end_percent_y/100.0)); 

     /* 
     * We cant speed up the big picture, because then we have to check pixels in the small picture equal to the speeded up size 
     * for each pixel in the big picture. 
     * Would give no speed improvement. 
     * */ 

     //+ 1 because first pixel is in picture. - small because image have to be fully in the other image 
     for (int x = x_start; x < x_end - small_image.Width + 1; x++) 
      for (int y = y_start; y < y_end - small_image.Height + 1; y++) 
      { 
       //now we check if all pixels matches 
       for (int sx = 0; sx < small_image.Width; sx += x_speedUp) 
        for (int sy = 0; sy < small_image.Height; sy += y_speedUp) 
        { 
         if (small_image[sx, sy] != big_image[x + sx, y + sy]) 
          goto CheckFailed; 
        } 

       //check ok 
       time_needed = DateTime.Now - begin; 
       return new Point(x, y); 

      CheckFailed: ; 
      } 

     time_needed = DateTime.Now - begin; 
     return CHECKFAILED; 
    } 
} 

}

回答

2

你不加入public訪問修飾符你的班級,因此自動聲明爲internal。修復它,一切都應該工作。

例如:

public class LockedFastImage { /*Your code...*/} 
1

您還沒有指定任何訪問說明符類,因此在默認情況下你的類是internal這就是爲什麼你不能裝配外部訪問它。

For classes and structs Access Modifier - MSDN

類和結構是直接聲明的名稱空間內(在其他 話,未嵌套在其它類或結構內)可以 是公共或內部。 如果未指定訪問 修飾符,則內部爲默認值。

public class LockedFastImage 
{.... 

您可能會看到Access Modifier C# - MSDN

內部

的類型或成員可以通過任何代碼在相同的組件進行訪問, 但不能從另一個組件。

相關問題