Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2013, 21:52   #1
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию Сохраняет пустое изображение

Доброго времени суток! Нужен Ваш совет! Необходимо, чтобы программа открывала изображение, изменяла его в черно-белое и таким сохраняло.
Все вроде бы работает нормально. Одна кнопка открывает картинку формата *.bmp. Вторая преобразовывает ее в черно-белое (результаты преобразования видны в объекте Image1). Третья сохраняет. Открывается диалоговое окно для сохранения, вписывается имя и все хорошо. Но! когда позже я открываю новый сохраненный файл, он пустой. Открывается пустая белая картинка. Что не так? Подскажите, пожалуйста.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x,h,w:integer;
  im1,im2:tbitmap;
  //xx,yy:word;
  
implementation

{$R *.dfm}

function RgbToGray(RGBColor : TColor) : TColor;
var Gray : byte;
begin
Gray:=Round((0.30*GetRValue(RGBColor))+
(0.59*GetGValue(RGBColor))+(0.11*GetBValue(RGBColor)));
Result:=RGB(Gray, Gray, Gray);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenPictureDialog1.Execute;
if OpenPictureDialog1.FileName='' then halt(1);
im1:=tbitmap.Create;
im1.loadfromfile(OpenPictureDialog1.FileName);
w:=im1.width;
h:=im1.height;
Image1.Picture.Bitmap.Assign(im1);
Form1.Button2.Enabled:=true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
im2:=TBitmap.Create;
Im2.Height:=Im1.Height;
Im2.Width:=Im1.Width;
if savepicturedialog1.execute then im2.savetofile(savepicturedialog1.filename);
 im2.free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;


procedure TForm1.Button2Click(Sender: TObject);
var i,j: integer;
    c,d: TColor;
begin
Label1.Visible:=True; //"Подождите, пожалуйста..."
Application.ProcessMessages;
for i:=Image1.Left to Image1.Left+Image1.Width do
for j:=Image1.Top to +Image1.Top+Image1.Height do
begin
c:=Image1.Picture.Bitmap.Canvas.Pixels[i-Image1.Left,j-Image1.Top];
d:=RgbToGray(c);
Image1.Picture.Bitmap.Canvas.Pixels[i-Image1.Left,j-Image1.Top]:=d;
end;
Label1.Visible:=False;
Application.ProcessMessages;
end;

end.
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 08.10.2013, 22:15   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,428
По умолчанию

А где в im2 загружается картинка перед сохранением?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.10.2013, 22:34   #3
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Эмм... Я это не реализовала(( А не подскажите тогда, как это правильно записать?
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 09.10.2013, 01:36   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,428
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bmp: tbitmap;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    bmp.loadfromfile(OpenPictureDialog1.FileName);
    Image1.Picture.Bitmap.Assign(bmp);
  end;
end;

function RgbToGray(RGBColor: TColor): TColor;
var
  Gray: byte;
begin
  Gray := Round((0.30 * GetRValue(RGBColor)) + (0.59 * GetGValue(RGBColor)) +
      (0.11 * GetBValue(RGBColor)));
  Result := RGB(Gray, Gray, Gray);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: integer;
begin
  Label1.Visible := True;
  for i := 0 to bmp.Height - 1 do
    for j := 0 to bmp.Width - 1 do
    begin
      Application.ProcessMessages;
      bmp.Canvas.Pixels[j, i] := RgbToGray(bmp.Canvas.Pixels[j, i]);
    end;
  Image1.Picture.Assign(bmp);
  Label1.Visible := False;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
    bmp.savetofile(SavePictureDialog1.FileName);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bmp := tbitmap.Create;
  Label1.Visible := False;
  Image1.AutoSize := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bmp.Free;
end;

end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.10.2013, 11:29   #5
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Спасибо! Честно признаюсь, даже не думала сделать одну переменную bmp. Почему то сразу решила разделить на две: до и после, так сказать. Еще раз огромное спасибо!
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать пустое полноцветное изображение casio23 Общие вопросы Delphi 5 16.05.2012 14:00
Значение агрегатного поля пустое. Саня БД в Delphi 4 19.02.2011 18:27
Пустое окно. 1234123 C++ Builder 20 12.08.2010 17:01
помогите убрать пустое место sstyle HTML и CSS 15 01.03.2010 16:58
пустое значение в listview D_E_N Общие вопросы Delphi 4 17.01.2010 16:27