비트 맵 2 가지 색상을 무작위로 포함하도록 코드를 설정했습니다. 10 회 중 7 회는 파란색으로, 3 회는 10 회 중 3 회는 녹색으로 표시됩니다. 그러나 작업이 끝나면 7 개의 파란색 픽셀을 몇 번 누른 다음 3 개의 녹색 픽셀을 몇 번씩 넣는 등 매우 무작위 적으로 보입니다.
예 :
내 코드입니다 : 당신이 추가 정보가 필요하면C# 응용 프로그램에서 임의의 픽셀 색이 너무 랜덤하지 않은 이유는 무엇입니까?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FourEx
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(canvas.Image);
System.Drawing.Imaging.BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, 800, 600), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
unsafe
{
int tempy = 0;
while (tempy < 600)
{
byte* row = (byte*)bmpdata.Scan0 + (tempy * bmpdata.Stride);
for (int x = 0; x <= 800; x++)
{
Random rand = new Random();
if (rand.Next(1,10) <= 7)
{
row[x * 4] = 255;
}
else
{
row[(x * 4) + 1] = 255;
}
}
tempy++;
}
}
bmp.UnlockBits(bmpdata);
canvas.Image = bmp;
}
}
}
알려주세요.
'LockBits'와'unsafe'를 사용하면 성능 최적화가됩니까? ['Bitmap.SetPixel'] (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setpixel.aspx)을 사용하면 훨씬 쉽게 할 수있는 것 같습니다. –
@Code Gray : Get/SetPixel의 성능은 이미지 조작을 수행하는 데 실제로 좋지 않습니다. 이는 픽셀 단위의 색상이 중요한 대규모 이미지 생성에 적합한 성능을 얻기위한 꽤 일반적인 방법입니다. –
@Chris : 알고 있습니다. 나는 그것이 성능상의 이유로 이루어 졌는지 또는 그가 더 간단한 대안을 알지 못하기 때문에 물었다. 당신이 말했듯이, 내가해야만하는 이미지 조작이 얼마나 큰지에 따라, 어플리케이션에서 둘 다 해냈습니다. 'Form.Load' 이벤트와 같이 무작위 이미지를 한 번만 생성한다면, 가능한 한 모든 퍼포먼스를 짜낼 필요가 없을 것입니다. –