Вземете растерно изображение и го начертайте в изображение

Опитвам се да запазя чертежа си от picturebox в растерно изображение и да начертая това растерно изображение в изображение. Досега нищо не се е появило в крайното изображение, но докато отстранявам грешки, мога само да кажа, че оригиналното растерно изображение не е нула и with/height са правилни. Въпреки това нищо не се появява, след като го начертая в изображение.

Запазвам чертежа си в растерно изображение по следния начин:

GraphicsPath path = RoundedRectangle.Create(x, y, width, height, corners, RoundedRectangle.RectangleCorners.All);
        g.FillPath(Brushes.LightGray, path);


        g.SetClip(path);

        using (Font f = new Font("Tahoma", 9, FontStyle.Bold))
            g.DrawString(mtb_hotspotData.Text, f, Brushes.Black, textX, textY);
        g.ResetClip();

        bitmap = new Bitmap(width, height, g);

След това го запазете:

hs.bitmap = new Bitmap(bitmap);

И накрая го използвайте:

for (int i = 0; i < imageSequence.Count; i++) {
            Graphics g = Graphics.FromImage(imageSequence[i]);
            //g.CompositingMode = CompositingMode.SourceOver;
            //hotspot.bitmap.MakeTransparent();
            int x = hotspot.coordinates[i].X;
            int y = hotspot.coordinates[i].Y;
            g.DrawImage(hotspot.bitmap, new Point(x, y));
        }


        return imageSequence;

Досега не успях да намеря никакъв проблем в това решение, следователно нямам представа къде е неизправността.


person pheno    schedule 11.04.2015    source източник
comment
къде се намират тези битове код?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 11.04.2015
comment
Тук има два класа. Рисувам и записвам графики в първи клас (формуляр за рисуване) и има клас, наречен hotspot, където се съхранява цялата информация за това растерно изображение (растерно изображение, X, Y).   -  person pheno    schedule 11.04.2015
comment
Може да е трудно да се намери такова нещо. Ако бях аз, щях да добавя някакъв код за запазване на растерните изображения за файл на подходящи места във вашия код и след това да видя дали можете да проследите глупавото. също минимизирайте и максимизирайте прозореца в различни точки, понякога пребоядисванията не се задействат там, където бихте очаквали.   -  person Tony Hopkinson    schedule 11.04.2015
comment
Благодаря ви, ще се опитам да запазя растерното изображение във файл. Също така трябва да отбележа, че след като начертая растерно изображение в изображение, генерирам avi видео от това изображение (ако това промени нещо)   -  person pheno    schedule 11.04.2015
comment
Така че, когато го запазя, той е празен. Резолюцията е правилна, размер = 165 байта, иконата е черна, но когато я отворя, е прозрачна. Следователно проблемът (или един от тях) е в процес на получаване от picturebox, нали?   -  person pheno    schedule 11.04.2015
comment
Какво е g excatly? Как се създава? Създавате ли растерното изображение след като сте направили рисунката???   -  person TaW    schedule 11.04.2015


Отговори (1)


Изглежда не разбирате връзката между Bitmap и Graphics обект.

  • Обект Graphics не съдържа никакви графики; това е инструмент, използван за изчертаване в на някакъв вид растерно изображение.

  • Конструкторът на растерни изображения, който използвате ( public Bitmap(int width, int height, Graphics g)) не наистина свързва обекта Bitmap и Graphics. Използва само dpi резолюция от Graphics.

Не показвате как е създадено вашето Graphics. Ако искате да рисувате в Bitmap (за разлика от повърхността на контрола), най-прекият начин е следният:

Bitmap bitmap = new Bitmap(width, height);
bitmap.SetResolution(dpiX, dpiY);  // optional

using (Graphics G = Graphics.FromImage(bitmap ))
{

   // do the drawing..
   // insert all your drawing code here!

}

// now the Bitmap can be saved or cloned..
bitmap.Save(..);
hs.bitmap = new Bitmap(bitmap);  // one way..
hs.bitmap = bitmap.Clone();      // ..or the other

// and finally disposed of (!!)
bitmap.Dispose();
person TaW    schedule 11.04.2015