[delphi] jpeg и Out of system resources

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 1n0y, 17 Jan 2011.

  1. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    есть функция, пишет в image нужный текст и сохраняет картинку на диск в jpg формат. но работает либо через раз, либо только один раз, либо вообще не работает.

    код:


    Code:
    var
    hgt:integer;
    jpeg:TJpegImage;
    begin
    
     // заливаем картинку черным цветом. вроде работает, но правильно ли?
    form1.image1.Canvas.Brush.Color:=clBlack;
    form1.Image1.Canvas.Rectangle(form1.Image1.ClientRect);
    form1.Image1.Repaint;
    
     //тут я пишу на картинке что нужно
    
     // сохраняю картинку в jpg. 
    jpeg:=tjpegimage.Create;
    jpeg.CompressionQuality:=65;
    jpeg.Assign(form1.image1.Picture.Graphic);
    if fileexists('123.jpeg')<>false then
     SysUtils.DeleteFile('123.jpeg');
    jpeg.SaveToFile('123.jpeg'); // тут вылетает ошибка Out of system resources
    jpeg.Free;
    result:='123.jpg';
     
    
    end;
    что я делаю не так?
    как правильно сохранить в жпг из имэйджа?
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Попробуй так:
    Code:
    jpeg.Assign(Form1.Image1.Picture.Bitmap);
    Хотя не знаю точно.
     
  3. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    не помогло.

    сделал сохранение так:

    Code:
    jpeg:=tjpegimage.Create;
      BitMap := TBitMap.Create;
      BitMap.Width := 200; 
      BitMap.Height := 300; 
      BitMap.Canvas.CopyRect(BitMap.Canvas.ClipRect,form1.Image1.Canvas,form1.Image1.Canvas.ClipRect);
      Jpeg.Assign(Bitmap);
      Jpeg.PixelFormat := jf24Bit;
      Jpeg.Compress;
      jpeg.SaveToFile('123.jpeg');
    
    ошибка вроде пропала, но часто сохраняет пустой белый лист, хотя в image рисуется всё правильно.
    ах да, если процедуру вызываю из главного потока - сохраняется всё отлично. если из какого-либо другого - белый лист :(
     
  4. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    отбой. отказался от тупорылого image и заюзал pngobject. и размер меньше, и нечего конвертить в жпг ненужно.
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Это зачем?) Ведь один фик файл будет перезаписан)
     
  6. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Делал когда-то это...просто написать текст в image и сохранить -
    PHP:
    Image:=TImage.Create(nil);
    image.Canvas.TextOut(300Edit1.text[i]);
    image.Picture.SaveToFile(edit1.text+'/'+inttostr(i2)+'.jpg');
    image.Free;
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 090808 ты создал мего гениальную вещь.
    Дай отгадаю, если тебе нужен сахар(но его нет), а есть соль, то ты наверное пересыпаешь соль в сахарницу, после чего радуешься тому что получил сахар?
    Если выражать более проще - то у тебя получается bmp файл с расширением jpg и следовательно огромного размера (т.к. нет сжатия). С таким успехом можно сохранять текст с расширением .rar и говорить что я создал архив
     
  8. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    Это да, не учёл :)
     
  9. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    ды еслибы. image ругается, что такой файл уже есть и не перезаписывает его, вызывая исключительную ситуацию.
    такие дела :(


    я ведь четко указал, что мне нужно ковертить в жпг :)