Schnelles SetPixel bei einem Bitmap


Für schnelleren Zugriff auf die Pixel eine Bitmaps kann folgender Code verwendet werden. Da das ganze auf Pointern aufbaut, muss mit einer “Unsafe” Klasse gearbeitet werden.

//Typedef
struct PixelData
{
  public byte blue;
  public byte green;
  public byte red;
  public byte alpha;
}

//Global vars
Byte* m_pStart = null;
int m_width = 0;
BitmapData m_bitmapData = null;

//Create new Image
Bitmap bmpImage = new Bitmap(300, 300, PixelFormat.Format24bppArgb);

//Get bitmap boarder
Rectangle border = new Rectangle(Point.Empty, bmpImage.Size);
width = (int)(border.Width * sizeof(PixelData));
if (width % 4 != 0)
  width = 4 * (width / 4 + 1);

//Lock Image
m_bitmapData = bmpImage.LockBits(border, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
m_pStart = (Byte*)m_bitmapData.Scan0.ToPointer();

//Set Pixel
PixelData* data = (PixelData*)(m_pStart + y * m_width + x * sizeof(PixelData));
data->alpha = 50;
data->red = 66;
data->green = 99;
data->blue = 22;

//Unlock Image
bmpImage.UnlockBits(m_bitmapData);
m_bitmapData= null;
m_pStart = null;



FolderBrowserDialog bleibt leer


Bei der Benutzung der FolderBrowseDialog Klasse kann es vorkommen, dass das angezeigte Fenster leer bleibt und nur die Buttons sichtbar sind. In diesem Fall kann der nachfolgende Coder verwendet werden:

// global var
private FolderBrowserDialog m_fbDlg = new FolderBrowserDialog();

// functions
private string getFilePath(string sStartPath)
{
  try
  {
    m_fbDlg.SelectedPath = sStartPath;
    Thread FolderDlgThread = new Thread(getFilePathThread);
    FolderDlgThread.SetApartmentState(ApartmentState.STA);
    FolderDlgThread.Start();
    FolderDlgThread.Join();

    return m_fbDlg.SelectedPath;
  }
  catch (Exception err)
  {
  MessageBox.Show(err.Message);
    return “”;
  }
}

[STAThread]
private void getFilePathThread()
{
  try
  {
    m_fbDlg.Site = null;
    m_fbDlg.ShowDialog();
  }
  catch (Exception err)
  {
    MessageBox.Show(err.Message);
  }
}



LCD Proc und LIS VFD Display


Für den Betrieb des LIS VFD Displays muss LCD Proc folgendermassen konfiguriert werden:

[server]
Driver=hd44780

[hd44780]
Device=/dev/ttyUSB0 # bei verwendung eines USB To Serial Converters
ConnectionType=lis2



Controls suchen


Wenn man dynamisch auf Controls zugreifen will, kann man sich die Controls mit folgendem Code suchen:

Control[] searchedControls = Controls.Find(”Name des Controls”, true);



Double in String mit vorgegebenem Format wandeln


Die Wandlung mit:
string sString = dValue.ToString(”0.00″, System.Globalization.CultureInfo.InvariantCulture);

Ergibt:
dValue = 22.998 -> sString = 22.99
dValue = 18.5 -> sString = 18.50



Eigene Events


Damit man eigene Events versenden kann, muss man folgendes implementieren:

public class Sender
{
  public event EventHandler MsgChangedEvent;
  protected virtual void Fire_MsgChangedEvent(EventArgs ea)
  {
    if (MsgChangedEvent != null)
      MsgChangedEvent(this, ea);
  }

  public void xyz()
  {
    …
    Fire_MsgChangedEvent(EventArgs.Empty);
    …
  }
}

public class Test
{
  public void Init()
  {
    Sender objSender = new Sender();
    objSender.MsgChangedEvent += new EventHandler (OnMsgChanged);
  }

  public void OnMsgChanged(Object sender, EventArgs ea)
  {
    //TODO
  }
}



RS232 Thread Exceptions


Beim Arbeiten mit der RS232 Schnittstelle kann es vorkommen, dass eine Exception auftritt wenn man aus dem OnDataEvent heraus versucht auf das Formular zuzugreifen.

Um dies zu verhindern reicht folgende Zeile:
CheckForIllegalCrossThreadCalls = false;



Schnelle CRC32 Berechnung durch Lookup Tabelle


Wenn für die Berechnung der CRC32 Checksumme folgender Code verwendet wird, welcher die Checksumme anhand der Lookup Tabelle berechnet wird diese ca. 8x schneller.

static protected uint[] uiLUT = new uint[256] {
0×00000000, 0×77073096, 0xEE0E612C, 0×990951BA, 0×076DC419, 0×706AF48F, 0xE963A535, 0×9E6495A3,
0×0EDB8832, 0×79DCB8A4, 0xE0D5E91E, 0×97D2D988, 0×09B64C2B, 0×7EB17CBD, 0xE7B82D07, 0×90BF1D91,
0×1DB71064, 0×6AB020F2, 0xF3B97148, 0×84BE41DE, 0×1ADAD47D, 0×6DDDE4EB, 0xF4D4B551, 0×83D385C7,
0×136C9856, 0×646BA8C0, 0xFD62F97A, 0×8A65C9EC, 0×14015C4F, 0×63066CD9, 0xFA0F3D63, 0×8D080DF5,
0×3B6E20C8, 0×4C69105E, 0xD56041E4, 0xA2677172, 0×3C03E4D1, 0×4B04D447, 0xD20D85FD, 0xA50AB56B,
0×35B5A8FA, 0×42B2986C, 0xDBBBC9D6, 0xACBCF940, 0×32D86CE3, 0×45DF5C75, 0xDCD60DCF, 0xABD13D59,
0×26D930AC, 0×51DE003A, 0xC8D75180, 0xBFD06116, 0×21B4F4B5, 0×56B3C423, 0xCFBA9599, 0xB8BDA50F,
0×2802B89E, 0×5F058808, 0xC60CD9B2, 0xB10BE924, 0×2F6F7C87, 0×58684C11, 0xC1611DAB, 0xB6662D3D,
0×76DC4190, 0×01DB7106, 0×98D220BC, 0xEFD5102A, 0×71B18589, 0×06B6B51F, 0×9FBFE4A5, 0xE8B8D433,
0×7807C9A2, 0×0F00F934, 0×9609A88E, 0xE10E9818, 0×7F6A0DBB, 0×086D3D2D, 0×91646C97, 0xE6635C01,
0×6B6B51F4, 0×1C6C6162, 0×856530D8, 0xF262004E, 0×6C0695ED, 0×1B01A57B, 0×8208F4C1, 0xF50FC457,
0×65B0D9C6, 0×12B7E950, 0×8BBEB8EA, 0xFCB9887C, 0×62DD1DDF, 0×15DA2D49, 0×8CD37CF3, 0xFBD44C65,
0×4DB26158, 0×3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0×4ADFA541, 0×3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0×4369E96A, 0×346ED9FC, 0xAD678846, 0xDA60B8D0, 0×44042D73, 0×33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0×5005713C, 0×270241AA, 0xBE0B1010, 0xC90C2086, 0×5768B525, 0×206F85B3, 0xB966D409, 0xCE61E49F,
0×5EDEF90E, 0×29D9C998, 0xB0D09822, 0xC7D7A8B4, 0×59B33D17, 0×2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0×9ABFB3B6, 0×03B6E20C, 0×74B1D29A, 0xEAD54739, 0×9DD277AF, 0×04DB2615, 0×73DC1683,
0xE3630B12, 0×94643B84, 0×0D6D6A3E, 0×7A6A5AA8, 0xE40ECF0B, 0×9309FF9D, 0×0A00AE27, 0×7D079EB1,
0xF00F9344, 0×8708A3D2, 0×1E01F268, 0×6906C2FE, 0xF762575D, 0×806567CB, 0×196C3671, 0×6E6B06E7,
0xFED41B76, 0×89D32BE0, 0×10DA7A5A, 0×67DD4ACC, 0xF9B9DF6F, 0×8EBEEFF9, 0×17B7BE43, 0×60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0×38D8C2C4, 0×4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0×3FB506DD, 0×48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0×36034AF6, 0×41047A60, 0xDF60EFC3, 0xA867DF55, 0×316E8EEF, 0×4669BE79,
0xCB61B38C, 0xBC66831A, 0×256FD2A0, 0×5268E236, 0xCC0C7795, 0xBB0B4703, 0×220216B9, 0×5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0×2BB45A92, 0×5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0×2CD99E8B, 0×5BDEAE1D,
0×9B64C2B0, 0xEC63F226, 0×756AA39C, 0×026D930A, 0×9C0906A9, 0xEB0E363F, 0×72076785, 0×05005713,
0×95BF4A82, 0xE2B87A14, 0×7BB12BAE, 0×0CB61B38, 0×92D28E9B, 0xE5D5BE0D, 0×7CDCEFB7, 0×0BDBDF21,
0×86D3D2D4, 0xF1D4E242, 0×68DDB3F8, 0×1FDA836E, 0×81BE16CD, 0xF6B9265B, 0×6FB077E1, 0×18B74777,
0×88085AE6, 0xFF0F6A70, 0×66063BCA, 0×11010B5C, 0×8F659EFF, 0xF862AE69, 0×616BFFD3, 0×166CCF45,
0xA00AE278, 0xD70DD2EE, 0×4E048354, 0×3903B3C2, 0xA7672661, 0xD06016F7, 0×4969474D, 0×3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0×40DF0B66, 0×37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0×47B2CF7F, 0×30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0×53B39330, 0×24B4A3A6, 0xBAD03605, 0xCDD70693, 0×54DE5729, 0×23D967BF,
0xB3667A2E, 0xC4614AB8, 0×5D681B02, 0×2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0×5A05DF1B, 0×2D02EF8D
};

public static uint CalcCRCStatic(char[] data)
{
  uint uiSize = (uint)data.Length;

  uint uiSum = 0xFFFFFFFF;
  for (uint i = 0; i < uiSize; ++i)
  {
    uiSum = ( uiSum >> 8 ) ^ uiLUT[(uiSum & 0xFF) ^ data[i]];
  }
  return (uiSum ^ 0xFFFFFFFF);
}



POST File uploads in PHP 5


In PHP5 funktioniert der File Upload/Zugriff mit $HTTP_POST_FILES nicht mehr.
Neu ist $_FILES zu verwenden.

Formular:
<form ENCTYPE=”multipart/form-data” ACTION=”<? echo “$PHP_SELF?aktion=insert” ?>” METHOD=”POST”>
<input type=”file” name=”source1″>
<input type=”submit” value=”Upload”>
</form>

Auswertung:
$sourceName = $_FILES[’source1′][’name’];
$pathOnServer = $_FILES[’source1′][’tmp_name’];
$fileType = $_FILES[’userfile’][’type’];
$fileSize = $_FILES[’userfile’][’size’];



MS SQL SELECT


Folgendes Beispiel liest die Spalte “LangID” per Index und die Spalte “LanguageEN” per Identifier aus.

SqlCommand selCommand = m_sqlConn.CreateCommand();
selCommand.CommandText = “SELECT * FROM Language ORDER BY LangID ASC”;
SqlDataReader selReader = null;

try
{
  selReader = selCommand.ExecuteReader();
  while (selReader.Read())
  {
    int iID = selReader.GetInt32(0);
    string LangEN = selReader[”LanguageEN”].ToString());
  }
}
catch(Exception ex){}

Next Page »

los lendos blog is proudly powered by WordPress and themed by Mukkamu