Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
1

Не сохраняется изображение

22.03.2013, 17:25. Просмотров 1583. Ответов 19
Метки нет (Все метки)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
 
Var
  myForm: System.Windows.Forms.Form;
  GraphBox: System.Drawing.Graphics;
  Pictures: System.Windows.Forms.PictureBox;
  x, y: integer;
 
Procedure MenuSaveClick(sender:object; args:System.EventArgs);
  Begin
    Var sd := new System.Windows.Forms.SaveFileDialog;
      sd.Filter := 'Png |*.png|Jpeg |*.jpg|Gif |*.gif|Bmp |*.bmp|Tiff |*.tiff';
      sd.FilterIndex := 1;
    Var bmp:=new System.Drawing.Bitmap (  
      If sd.ShowDialog=System.Windows.Forms.DialogResult.OK Then 
       Begin
         Var format: System.Drawing.Imaging.ImageFormat;
          Case sd.FilterIndex of 
           1: format := System.Drawing.Imaging.ImageFormat.Png;
           2: format := System.Drawing.Imaging.ImageFormat.Jpeg;
           3: format := System.Drawing.Imaging.ImageFormat.Gif;
           4: format := System.Drawing.Imaging.ImageFormat.Bmp;
           5: format := System.Drawing.Imaging.ImageFormat.Tiff;
        End;   
        
        Pictures.Image.Save (sd.FileName,format);
      End;  
  End;
 
procedure OnMouseDown(sender: object; e: System.Windows.Forms.MouseEventArgs);
    begin
      x := e.x;
      y := e.y;
    end; 
 
    procedure OnMouseMove(sender: object; e: System.Windows.Forms.MouseEventArgs);
    begin
      if e.Button = System.Windows.Forms.MouseButtons.Left then 
      begin
        GraphBox.DrawLine(new System.Drawing.Pen(System.Drawing.Color.FromARGB(PABCSystem.Random(255),PABCSystem.Random(255),PABCSystem.Random(255))),x,y,e.x,e.y);
        x := e.x;
        y := e.y;
      end;
    end; 
 
Begin
  myForm := new System.Windows.Forms.Form;
  
 
      
  var toolStrip1 := new System.Windows.Forms.ToolStrip;
  toolStrip1.GripStyle := System.Windows.Forms.ToolStripGripStyle.Hidden;
  var miFile := new System.Windows.Forms.ToolStripMenuItem('Файл');  
  miFile.DropDownItems.Add(new System.Windows.Forms.ToolStripMenuItem('Сохранить как...',nil,MenuSaveClick));
  toolStrip1.Items.Add(miFile);
  myForm.Controls.Add(toolStrip1);
  
  Pictures:= new System.Windows.Forms.PictureBox;
  Pictures.Size:=new System.Drawing.Size(200,800);
  
  myForm.Controls.Add (Pictures);
 
  GraphBox:=System.Drawing.Graphics.FromHwnd (Pictures.Handle);
  GraphBox.SmoothingMode:=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
  
  Pictures.MouseDown    += OnMouseDown;
Pictures.MouseMove  += OnMouseMove;
  
      
  System.Windows.Forms.Application.Run(myForm);
end.
Почему то, что я нарисовал не сохраняется? Где ошибка?

Добавлено через 23 часа 39 минут
Может кто знает через конструктор. Я находил много исходников, но там не только процесс сохранения но целые проги, и с конструкторами. Вытащить оттуда это для меня сложновато.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2013, 17:25
Ответы с готовыми решениями:

Не сохраняется изображение в файл
Есть 2 файла: 1.bmp и 2.bmp. Загружаю в программу первый файл 1.bmp-работает. Дорисовываю на...

Не сохраняется изображение из pictureBox
Мне нужно сохранить изображение из pictureBox2 в .bmp файл. Но сохраняется только серый фон, вместо...

Неправильно сохраняется изображение!
Здравствуйте, форумчане! Написал небольшой код, суть такова: Он смотрит на картинку, делит ее...

Изображение не сохраняется в базу данных
Я использую mysql. Пытаюсь сохранить картинку в базу, вот код: if($_FILES==0&&$_POST){...

GDI+ неправильно сохраняется изображение
Всем доброго времени суток! Возникла проблема при сохранении BMP при помощи функций GDI+. Делаю...

19
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
22.03.2013, 21:56 2
serёга, эмм, у меня вообще не запускается...
0
Миниатюры
Не сохраняется изображение  
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 13:25  [ТС] 3
Это не важно, мне бы знать сам алгоритм сохранения в файл содержимого Graphics.

Добавлено через 3 минуты
Что касается ошибки, удалите стоку перед выделенным.
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 13:46 4
serёга, ошибка выдаётся потому, что вы не присвоили Pictures.Image ничего т.е Pictures.Image пустой, следовательно его нельзя сохранить.
0
23.03.2013, 13:46
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 13:49  [ТС] 5
А как его туда присвоить?
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 13:50 6
serёга, без понятия
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 14:15  [ТС] 7
Я тоже. Исходников много а толку не какого. Там ничего не понятно
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 14:35 8
serёга, вот посмотрите:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  myForm: System.Windows.Forms.Form;
  GraphBox: System.Drawing.Graphics;
  Pictures: System.Windows.Forms.PictureBox;
  Bm: Bitmap;
  X, Y, cX, cY: integer;
  Down: boolean := False;
 
procedure MenuSaveClick(sender: object; args: System.EventArgs);
begin
  var sd := new System.Windows.Forms.SaveFileDialog;
  sd.Filter := 'Png |*.png|Jpeg |*.jpg|Gif |*.gif|Bmp |*.bmp|Tiff |*.tiff';
  sd.FilterIndex := 1; 
  if sd.ShowDialog = System.Windows.Forms.DialogResult.OK Then 
  begin
    var format: System.Drawing.Imaging.ImageFormat;
    case sd.FilterIndex of 
      1: format := System.Drawing.Imaging.ImageFormat.Png;
      2: format := System.Drawing.Imaging.ImageFormat.Jpeg;
      3: format := System.Drawing.Imaging.ImageFormat.Gif;
      4: format := System.Drawing.Imaging.ImageFormat.Bmp;
      5: format := System.Drawing.Imaging.ImageFormat.Tiff;
    End;   
    
    Pictures.Image.Save(sd.FileName, format);
  end;  
end;
 
procedure OnMouseDown(sender: object; e: System.Windows.Forms.MouseEventArgs);
begin
  Down := True;
  
  X := MyForm.Left;
  Y := MyForm.Top;
  
  cX := System.Windows.Forms.Cursor.Position.X;
  cY := System.Windows.Forms.Cursor.Position.Y;
end;
 
procedure OnMouseUp(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := False;
end;
 
procedure OnMouseMove(sender: object; e: System.Windows.Forms.MouseEventArgs);
begin
  if Down then
  begin
    Bm.SetPixel(System.Windows.Forms.Cursor.Position.X - cX + X, System.Windows.Forms.Cursor.Position.Y - cY + Y, Color.Red);
    Pictures.Image := Bm;
  end;
end;
 
begin
  myForm := new System.Windows.Forms.Form;
  
  
  
  var toolStrip1 := new System.Windows.Forms.ToolStrip;
  toolStrip1.GripStyle := System.Windows.Forms.ToolStripGripStyle.Hidden;
  var miFile := new System.Windows.Forms.ToolStripMenuItem('Файл');  
  miFile.DropDownItems.Add(new System.Windows.Forms.ToolStripMenuItem('Сохранить как...', nil, MenuSaveClick));
  toolStrip1.Items.Add(miFile);
  myForm.Controls.Add(toolStrip1);
  
  Bm := new Bitmap('123.png');
  
  Pictures := new System.Windows.Forms.PictureBox;
  Pictures.Size := new System.Drawing.Size(200, 800);
  Pictures.Image := Bm;
  
  myForm.Controls.Add(Pictures);
  
  GraphBox := System.Drawing.Graphics.FromHwnd(Pictures.Handle);
  GraphBox.SmoothingMode := System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  
  
  Pictures.MouseDown    += OnMouseDown;
  Pictures.MouseMove  += OnMouseMove;
  Pictures.MouseUp += OnMouseUp;
  
  
  System.Windows.Forms.Application.Run(myForm);
end.
Конечно рисует не очень (мягко говоря ) но зато сохраняет.

P.S. Что бы запустить закиньте в папку с программой вот эту картинку.
1
Изображения
 
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 16:08  [ТС] 9
Спасибо большое, но я немного не понял 123.png - картинка которая загружается в начале в PictureBox?

Добавлено через 4 минуты
Что-то Microsoft.net ругается, что-то с параметром x не так. не знаете-ли?
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 16:16 10
Цитата Сообщение от serёга Посмотреть сообщение
Спасибо большое, но я немного не понял 123.png - картинка которая загружается в начале в PictureBox?
Картинка загружается в Bitmap (на котором рисуем), а уже Bitmap присваивается PictureBox.
Цитата Сообщение от serёга Посмотреть сообщение
Что-то Microsoft.net ругается, что-то с параметром x не так. не знаете-ли?
Это происходит когда X становится больше чем PictureBox.Width. Как я и говорил там особо не порисуешь, нужен более совершенный алгоритм
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 16:41  [ТС] 11
А с класса Graphics можно как-нибудь "Выдрать" bitmap?
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 16:44 12
serёга, я пробовал из Graphics "выдрать" рисунок для PictureBox - ничё не получилось... Для Bitmao не пробовал, попробуйте вы
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 16:52  [ТС] 13
Что-то и не пойму как это сделать. Это какой-то функцией нужно воспользоваться?
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 17:27 14
serёга, в том то и дело что
Цитата Сообщение от BaboshinSD Посмотреть сообщение
без понятия
Попробуйте погуглить примеры на других языках (Delphi, C# и пр.) может что-то найдёте.
1
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 18:53  [ТС] 15
А что, если создать цикл в цикле, двумерный массив где будут координаты x, y и обычный массив типа Color.
Тогда при сохранении каждый пиксель запишется в наши массивы, а потом создаётся bitmap и все символы подобным образом запишутся в него, а потом и сохранится. Думаю прога тупить немного будет зато можно будет сохранить и рисовать нормально.

Добавлено через 1 минуту
Только теперь нужно сдирать каждый пиксель с Graphics.
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
23.03.2013, 18:55 16
Цитата Сообщение от serёга Посмотреть сообщение
А что, если создать цикл в цикле, двумерный массив где будут координаты x, y и обычный массив типа Color.
Тогда при сохранении каждый пиксель запишется в наши массивы
Заново создаёте формат .bmp, но попробовать можно)
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 19:10  [ТС] 17
Ок. я уже начал. А содрать пиксель с graphics по его координатам?
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
23.03.2013, 23:12  [ТС] 18
Как?

Добавлено через 3 часа 46 минут
BaboshinSD, я рыл инет и ничего не нашёл подходящего. Исходников мало, некоторые я уже видел, но они написаны очень сложно. Эта процедура тормозит мою работу над прогой вцелом. так как я хотел добавить функцию сохранения. И я начал работу именно с ней.
0
BaboshinSD
341 / 280 / 49
Регистрация: 15.11.2012
Сообщений: 477
Записей в блоге: 1
24.03.2013, 01:02 19
serёга, у меня было несколько примеров с сохранением картинки. Посмотрю их, попробую сам написать, если что получится вам скину с комментариями.
0
serёга
46 / 41 / 12
Регистрация: 27.08.2012
Сообщений: 290
24.03.2013, 15:10  [ТС] 20
Ок. Я пока полазею в стандартных модулях, ведь там можно сохранять изображение.

Добавлено через 1 час 18 минут
BaboshinSD, у меня прогресс! Уже сохраняется изображение только прозрачное, но зато без ошибок и рисовать можно.

Добавлено через 4 часа 19 минут
Вы просто не представляете какой у меня всплеск эмоции.
Я сделал это!
Вот код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
Var
  myForm: System.Windows.Forms.Form;
  g: System.Drawing.Graphics;        {Вырисовка на экране}
  gr: System.Drawing.Graphics;       {Вырисовка в "буффере"}
  x, y : integer;
  bmap: System.Drawing.Bitmap;
{==================================================================================================}
Function GetView(b: System.Drawing.Bitmap; r: System.Drawing.Rectangle): System.Drawing.Bitmap; {функцию взял из стандартного модуля GraphABCHelper}
   Var w,h,stride,padding,pixelFormatSize: integer;
       ptr,start: System.IntPtr;
       rect: System.Drawing.Rectangle;
       bmpData: System.Drawing.Imaging.BitmapData;
     Begin
       w := b.Width;
       h := b.Height;
       rect := new System.Drawing.Rectangle(0,0,w,h);
       bmpData := b.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, b.PixelFormat);
       ptr := bmpData.Scan0;
       b.UnlockBits(bmpData);
       pixelFormatSize := System.Drawing.Image.GetPixelFormatSize(b.PixelFormat) div 8;
       r := System.Drawing.Rectangle.Intersect(r,rect);
       start := (System.IntPtr)(integer(ptr) + w * pixelFormatSize * r.Y + r.X * pixelFormatSize);
       stride := w * pixelFormatSize;
       padding := stride mod 4;
        If padding<>0 Then 
            stride := stride + 4 - padding;
       Result := new System.Drawing.Bitmap(r.Width,r.Height,stride,b.PixelFormat,start);
     End;
{==================================================================================================}
Procedure SaveWindow(fname: string); {Взял из модуля GraphABC}
   Begin
     Var tempbmp := GetView(bmap,new System.Drawing.Rectangle(0,0,myForm.Width,myForm.Height));
     tempbmp.Save(fname);
     tempbmp.Dispose;
   End;
{==================================================================================================} 
Procedure MenuSaveClick(sender: object; args: System.EventArgs);
  Begin
    Var sd := new System.Windows.Forms.SaveFileDialog;
    sd.Filter := 'Png |*.png|Jpeg |*.jpg|Gif |*.gif|Bmp |*.bmp|Tiff |*.tiff';
    sd.FilterIndex := 1; 
     If sd.ShowDialog = System.Windows.Forms.DialogResult.OK Then Begin
       Var s: string;
        Case sd.FilterIndex of 
          1: s:='.png';
          2: s:='.jpg';
          3: s:='.gif';
          4: s:='.bmp';
          5: s:='.tiff';
        End;   
       SaveWindow (sd.FileName+s);
      End;  
   End;
{==================================================================================================}    
Procedure OnMouseDown(sender: object; e: System.Windows.Forms.MouseEventArgs);
    Begin
      x := e.x;
      y := e.y;
    End; 
{==================================================================================================}     
Procedure OnMouseMove(sender: object; e: System.Windows.Forms.MouseEventArgs);
    Begin
      If e.Button = System.Windows.Forms.MouseButtons.Left Then 
      Begin
        gr.DrawLine(new System.Drawing.Pen(System.Drawing.Color.Black),x,y,e.x,e.y);
        g.DrawLine(new System.Drawing.Pen(System.Drawing.Color.Black),x,y,e.x,e.y);
        x := e.x;
        y := e.y;
      End;
    End;
{==================================================================================================}  
Begin
  myForm := new System.Windows.Forms.Form;
  myForm.Size:= new System.Drawing.Size (800, 600);
  Var toolStrip1 := new System.Windows.Forms.ToolStrip;
  toolStrip1.GripStyle := System.Windows.Forms.ToolStripGripStyle.Hidden;
  Var miFile := new System.Windows.Forms.ToolStripMenuItem('Файл');  
  miFile.DropDownItems.Add(new System.Windows.Forms.ToolStripMenuItem('Сохранить как...', nil, MenuSaveClick));
  toolStrip1.Items.Add(miFile);
  myForm.Controls.Add(toolStrip1);
 
  bmap := new System.Drawing.Bitmap(myForm.Width, myForm.Height); //
  g := System.Drawing.Graphics.FromHwnd(myForm.Handle);                // Взял из модуля GraphABC; 
  gr := System.Drawing.Graphics.FromImage(bmap);                           //
 
  myForm.MouseDown    += OnMouseDown;
  myForm.MouseMove  += OnMouseMove;
  System.Windows.Forms.Application.Run(myForm);
End.
Прога и рисует и сохраняет (сохраняет, правда, долговато). Нужно было ввести две переменных graphics и покапать стандартные модули.
2
24.03.2013, 15:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2013, 15:10

Drawstring: изображение сохраняется некачественным
Image img = new Bitmap(790, 1230); Graphics g = Graphics.FromImage(img); ...

Не сохраняется файл, как изображение
привет всем! я не могу сохранить файл, как картинку. вернее сохраняется,но ее не видно на рабочем...

Не сохраняется изображение png в файл
Доброго времени суток! Не получается записать изображение в файл. cropButtonSlot получает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.