سؤال

في دلفي 7، ولدي مكتبة يستخدم عنصر TCanvas لإخراج بعض المعلومات. الصورة الناتجة حوالي 4800 * 6000 بكسل وأود أن طباعته وحفظه كما .jpeg.

لتحقيق ذلك، أنا خلق TBitmap وأعطى قماش لها كمعلمة إلى المكتبة وبعد ذلك تعيين الصورة النقطية إلى الحياة السياسية في فرنسا. على ما يبدو، وهذا يأخذ الكثير من الذاكرة، لأنني الحصول على استثناء عند محاولة تعيين عرض الصورة النقطية والارتفاع، قائلا "ليس تخزين غير كافية لمعالجة هذا الأمر."

// output to printer
Printer.BeginDoc();
doPrint(Printer.Canvas);
Printer.EndDoc();

// output in bmp.Canvas
bmp := TBitmap.Create;
bmp.Width := Printer.PageWidth;
bmp.Height := Printer.PageHeight; // <- BAM! Exception!
doPrint(bmp.Canvas);

// save as jpeg
jpg := TJPEGImage.Create;
jpg.Assign(bmp);
jpg.SaveToFile('...');

// free
bmp.Free();
jpg.Free();

وماذا أفعل الخطأ؟ هل أستطيع حفظ Printer.Canvas مباشرة كملف .jpeg؟

وتحرير: تحديث الصورة بالحجم تقريب بين عامي 2000 * 2000-4800 * 6000

هل كانت مفيدة؟

المحلول

ويجب أن تكون قادرة على معالجة الصور النقطية كبيرة باستخدام TBitmap32 من Graphic32 ( http://www.graphics32.org / ويكي / )

نصائح أخرى

ويجب تعيين pixelformat لBMP إلى شيء قبل التحجيم حتى السجناء، كما يقترح بن زيغلر. وهذا يجعل جميع الفرق.

ويحدث هذا الخطأ إذا قمت بتعيين حجم الصورة النقطية إلى شيء أكبر من الشركة المصرية للاتصالات حجم لك سطح المكتب. لتجنب هذا الخطأ يمكنك إنشاء صورة نقطية مستقلة الجهاز بالطريقة التالية:

bmp := TBitmap.Create;
bmp.HandleType := bmDIB;
bmp.Width := Printer.PageWidth;
bmp.Height := Printer.PageHeight; 

وإذا كنت بحاجة إلى هذا الحل يعتمد على قدرات بطاقة الفيديو. كان لدينا هذا الخطأ كثيرا في حالات ملقم المحطة الطرفية حيث تم تخصيص ليس كثيرا RAM الفيديو لدورة واحدة. استخدام هذا الحل الذي يجبر دلفي لاستخدام RAM الطبيعي نقطية بدلا من الذاكرة على بطاقة الفيديو.

والطبقة TBitmap دلفي لديها مشاكل التعامل مع هذه الصور النقطية كبيرة. ولا، لا يمكنك حفظ TCanvas مباشرة إلى ملف .jpg.

وحاولت التعليمات البرمجية التالية على الجهاز الخاص بي (ويندوز XP، دلفي 2006)، وأنه لم يتلق أي استثناءات. ما OS الذي تستخدمه؟

  procedure TForm3.Button3Click(Sender: TObject);
  var
     bmp : TBitmap;
  begin
     bmp := TBitmap.Create;
     bmp.PixelFormat := pf32bit;
     bmp.Width := 6000;
     bmp.Height := 4800;
     bmp.Free;
  end;

وكما قال mghie: ذلك يعتمد كثيرا على النظام الخاص بك يمكنك الاطلاع على EFGs مختبر الحاسوب على صور نقطية كبيرة

ومحاولة تعيين PixelFormat إلى pf32bit أو pf24bit (كما في مثال بن زيغلر)، في معظم الحالات، هذا PixelFormat لا حيلة (على ما أذكر، وكان أساسا على XP). يمكنك العثور على مزيد من المعلومات هنا .

وانها ليست صيغة JPEG: المواصفات تسمح الصور النقطية كبيرة مثل 32767x32767 بكسل

.

والمشكلة تكمن في استهلاك ذاكرة ضخمة من الصور النقطية كبيرة، <م> و حدود TCanvas أنه في نهاية المطاف يمكن تتبع وصولا الى منصة ويندوز.

مكتبة NativeJpg بلدي يترجم معالجة JPEG منفصلة عن التصور، ويمكنك على سبيل المثال حفظ هذا JPEG باستخدام "شريط من الشريط"، مع البلاط نقطية أكثر سهولة نتيجة لذلك.

وNativeJpg مفتوح المصدر ويمكنك تحميل هذا ليب هنا: http://www.simdesign.nl/forum/viewforum.php؟f=16

ونظرة على tiledemo لمعرفة كيفية إنشاء وحفظ الصور JPEG ضخمة الاصطناعي.

مع أطيب التحيات، نيلس

لتستهلك ذاكرة أقل، يمكنك دائما محاولة إنشاء الصور النقطية أصغر. دعونا نقول لكم تقسيم ارتفاع الطابعة عن طريق 10، أو تعيين أقصى ارتفاع ل1000. مجرد اقتراح، ولست متأكدا إذا كان قابلا للتطبيق في الحالة الخاصة بك. فإنه ينتج صورة أكثر من واحد في الصفحة.

ولست متأكدا إذا كان هذا العمل أو المساعدة. إلا أننا أنشأنا وظيفة والذي سيوفر مكون إلى الحياة السياسية في فرنسا:

    function SaveComponentToJPeg(mControl: TWinControl): TJpegImage;
    var
      bmp: TPicture;
      jpg : TJpegImage;
      dc: HDC;
      wnd: HWND;
      Params: array[0..255] of Char;

    begin
      bmp:=TPicture.Create;
      jpg := TJpegImage.create;
      try
        bmp.Bitmap.Width  := mControl.Width  - 05;  // Deduct for border.
        bmp.Bitmap.Height := mControl.Height -05;  // Deduct for border.
        wnd               := mControl.Handle;  //ctiveWindow;
        dc                := GetDc(wnd);
        BitBlt(bmp.Bitmap.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,SrcCopy);
        ReleaseDc(wnd, dc);
        jpg.assign(bmp.bitmap);
        result := jpg
      finally
        bmp.Free;
      end;
    end;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top