#include <stdio.h>
const int BYTES_PER_PIXEL = 3; /// red, green, & blue
const int FILE_HEADER_SIZE = 14;
const int INFO_HEADER_SIZE = 40;
void generateBitmapImage(unsigned char* image, int height, int width, char* imageFileName);
unsigned char* createBitmapFileHeader(int height, int stride);
unsigned char* createBitmapInfoHeader(int height, int width);
int main()
{
int height = 361;
int width = 867;
unsigned char image[361][867][BYTES_PER_PIXEL];
char* imageFileName = (char*)"c:\\Work\\bitmapImage.bmp";
int i, j;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
image[i][j][2] = (unsigned char)(i * 255 / height); ///red
image[i][j][1] = (unsigned char)(j * 255 / width); ///green
image[i][j][0] = (unsigned char)((i + j) * 255 / (height + width)); ///blue
}
}
generateBitmapImage((unsigned char*)image, height, width, imageFileName);
printf("Image generated!!");
}
void generateBitmapImage(unsigned char* image, int height, int width, char* imageFileName)
{
int widthInBytes = width * BYTES_PER_PIXEL;
unsigned char padding[3] = { 0, 0, 0 };
int paddingSize = (4 - (widthInBytes) % 4) % 4;
int stride = (widthInBytes)+paddingSize;
FILE* imageFile = fopen(imageFileName, "wb");
unsigned char* fileHeader = createBitmapFileHeader(height, stride);
fwrite(fileHeader, 1, FILE_HEADER_SIZE, imageFile);
unsigned char* infoHeader = createBitmapInfoHeader(height, width);
fwrite(infoHeader, 1, INFO_HEADER_SIZE, imageFile);
int i;
for (i = 0; i < height; i++) {
fwrite(image + (i * widthInBytes), BYTES_PER_PIXEL, width, imageFile);
fwrite(padding, 1, paddingSize, imageFile);
}
fclose(imageFile);
}
unsigned char* createBitmapFileHeader(int height, int stride)
{
int fileSize = FILE_HEADER_SIZE + INFO_HEADER_SIZE + (stride * height);
static unsigned char fileHeader[] = {
0,0, /// signature
0,0,0,0, /// image file size in bytes
0,0,0,0, /// reserved
0,0,0,0, /// start of pixel array
};
fileHeader[0] = (unsigned char)('B');
fileHeader[1] = (unsigned char)('M');
fileHeader[2] = (unsigned char)(fileSize);
fileHeader[3] = (unsigned char)(fileSize >> 8);
fileHeader[4] = (unsigned char)(fileSize >> 16);
fileHeader[5] = (unsigned char)(fileSize >> 24);
fileHeader[10] = (unsigned char)(FILE_HEADER_SIZE + INFO_HEADER_SIZE);
return fileHeader;
}
unsigned char* createBitmapInfoHeader(int height, int width)
{
static unsigned char infoHeader[] = {
0,0,0,0, /// header size
0,0,0,0, /// image width
0,0,0,0, /// image height
0,0, /// number of color planes
0,0, /// bits per pixel
0,0,0,0, /// compression
0,0,0,0, /// image size
0,0,0,0, /// horizontal resolution
0,0,0,0, /// vertical resolution
0,0,0,0, /// colors in color table
0,0,0,0, /// important color count
};
infoHeader[0] = (unsigned char)(INFO_HEADER_SIZE);
infoHeader[4] = (unsigned char)(width);
infoHeader[5] = (unsigned char)(width >> 8);
infoHeader[6] = (unsigned char)(width >> 16);
infoHeader[7] = (unsigned char)(width >> 24);
infoHeader[8] = (unsigned char)(height);
infoHeader[9] = (unsigned char)(height >> 8);
infoHeader[10] = (unsigned char)(height >> 16);
infoHeader[11] = (unsigned char)(height >> 24);
infoHeader[12] = (unsigned char)(1);
infoHeader[14] = (unsigned char)(BYTES_PER_PIXEL * 8);
return infoHeader;
}
01 October 2020
Create Bitmap example
03 June 2020
Easy way of finding centriod using octave
Octave code:
A=[10 11; 20 21; 30 31; 40 41; 50 51; 60 61; 70 71]
PB = [1 1 3 3 2 2 2]
C = A (PB==3,:)
D = mean(C)
SD = size(C,1)
Results:
A =
10 11
20 21
30 31
40 41
50 51
60 61
70 71
PB =
1 1 3 3 2 2 2
C =
30 31
40 41
D =
35 36
SD = 2
Simplified code:
for i=1:K
centroids(i,:) = mean( X(idx==i,:) );
endfor
A=[10 11; 20 21; 30 31; 40 41; 50 51; 60 61; 70 71]
PB = [1 1 3 3 2 2 2]
C = A (PB==3,:)
D = mean(C)
SD = size(C,1)
Results:
A =
10 11
20 21
30 31
40 41
50 51
60 61
70 71
PB =
1 1 3 3 2 2 2
C =
30 31
40 41
D =
35 36
SD = 2
Simplified code:
for i=1:K
centroids(i,:) = mean( X(idx==i,:) );
endfor
02 June 2020
Array indexing in Octave
A=[10 11; 20 21; 30 31; 40 41; 60 61; 60 61; 70 71]
PB = [1 3 5]
B = [1 2 3 4 7]
C = A (B(PB),:)
D = mean(C)
A =
10 11
20 21
30 31
40 41
60 61
60 61
70 71
PB =
1 3 5
B =
1 2 3 4 7
C =
10 11
30 31
70 71
D =
36.667 37.667
PB = [1 3 5]
B = [1 2 3 4 7]
C = A (B(PB),:)
D = mean(C)
A =
10 11
20 21
30 31
40 41
60 61
60 61
70 71
PB =
1 3 5
B =
1 2 3 4 7
C =
10 11
30 31
70 71
D =
36.667 37.667
25 April 2020
WPF update user interface in multithreading mode
public partial class Window1 : Window
{
public Class1 c;
public Window1()
{
InitializeComponent();
c = new Class1();
c.Class1Event += C_Class1Event;
}
private void C_Class1Event(object sender, Class1EventArgs e)
{//Triggered from a different thread
this.Dispatcher.Invoke((Action)(() =>
{//this refer to form in WPF application
imgShirt.Source = new BitmapImage(new Uri(System.AppDomain.CurrentDomain.BaseDirectory + @"\images2.jpg", UriKind.RelativeOrAbsolute));
}));
}
private void Change_Click(object sender, RoutedEventArgs e)
{
c.Start();
}
private void Change2_Click(object sender, RoutedEventArgs e)
{//Called from the same thread
Uri fileUri = new Uri(System.AppDomain.CurrentDomain.BaseDirectory + @"\images.jpg", UriKind.RelativeOrAbsolute);
imgShirt.Source = new BitmapImage(fileUri);
}
}
public class Class1
{
public event EventHandler<Class1EventArgs> Class1Event;
public Class1()
{
}
public void Start()
{
Task.Run(() => {
Class1EventArgs e = new Class1EventArgs();
Class1Event(this, e);
});
}
}
public class Class1EventArgs : EventArgs
{
}
31 January 2020
How to deserialize Xml with different namespaces / prefixes
Specify the namespace in the child element
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace= "http://search.yahoo.com/mrss/", IsNullable=false)]
public partial class group {
private groupContent[] contentField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("content")]
public groupContent[] content {
get {
return this.contentField;
}
set {
this.contentField = value;
}
}
}
Use the XmlElement tag and specify the namespace in the parent node
/// <remarks/>
public string pubDate {
get {
return this.pubDateField;
}
set {
this.pubDateField = value;
}
}
[XmlElement("group", Namespace = "http://search.yahoo.com/mrss/")]
public group group
{
get
{
return this.groupField;
}
set
{
this.groupField = value;
}
}
}
Note: If you want to use the Visual Studio xsd.exe to generate the C# class, you need to strip off the elements with different namespace for xsd.exe to work. You can add the separate elements manually after.
Subscribe to:
Posts (Atom)