Tôi đã có một biểu mẫu với một TImage lớn trên đó làm nền. Vấn đề là, điều này được lưu trữ trực tiếp trong DFM dưới dạng bitmap, chiếm khoảng 3 MB. Tệp PNG gốc là ~ 250K. Tôi muốn cố gắng giảm sưng lên bằng cách nhúng PNG vào tài nguyên, và sau đó có biểu mẫu tải nó trong OnCreate. Tôi có thể làm điều đó ngay bây giờ mà Delphi 2009 bao gồm hỗ trợ PNG, ngoại trừ tôi không hoàn toàn biết làm thế nào để xây dựng một tập tin tài nguyên với một PNG trong đó. Bất cứ ai biết làm thế nào được thực hiện?Làm cách nào để tạo tài nguyên PNG?
Trả lời
Ví dụ tập tin văn bản (tên myres.rc):
MYPNG RCDATA mypng.png
Đã thêm vào dự án:
{$R 'myres.res' 'myres.rc'}
Ví dụ về tải trong thời gian chạy:
uses
PngImage;
var
Png: TPngImage;
begin
Png := TPngImage.Create;
try
Png.LoadFromResourceName(HInstance, 'MYPNG');
Image1.Picture.Graphic := Png; // Image1: TImage on the form
finally
Png.Free;
end;
end;
Nếu bạn đang sử dụng Delphi 2009, TImage sẽ lưu trữ tệp PNG của bạn dưới dạng PNG vào tệp DFM. DFM sẽ lớn hơn vì nội dung nhị phân của thuộc tính Picture.Data của đối tượng TImage được mã hóa trong DFM dưới dạng văn bản thập lục phân. Nhưng khi DFM được biên dịch vào EXE của bạn, nó được biên dịch thành một tài nguyên nhị phân. Hình ảnh của bạn sau đó sẽ chiếm cùng một không gian bên trong tài nguyên RCDATA của biểu mẫu khi lưu trữ PNG trong tài nguyên RCDATA của nó.
Tôi vừa thử nghiệm điều này bằng cách mở một trong các tệp DFM Delphi 2009 của riêng tôi có thành phần TImage có hình ảnh PNG được tải tại thời điểm thiết kế trong trình chỉnh sửa văn bản, sao chép nội dung của thuộc tính Picture.Data và dán chúng vào trình chỉnh sửa hex. Trình soạn thảo hex cho tôi biết rằng thuộc tính Picture.Data lưu trữ một tệp PNG thực có tiền tố là 10 byte. Byte đầu tiên là $ 09 và 9 byte chính tả tiếp theo là TPngImage. Nếu tôi xóa 10 byte đó và lưu tệp trong trình chỉnh sửa hex, tôi sẽ nhận được tệp PNG thích hợp.
Vì vậy, nếu bạn đang sử dụng Delphi 2009, chỉ cần tải hình ảnh PNG vào thành phần TImage tại thời điểm thiết kế.
Thú vị, nhưng về trường hợp hình ảnh được tái sử dụng trên nhiều biểu mẫu? Delphi có đủ thông minh để lưu trữ chỉ một bản sao, hay nó lưu trữ hình ảnh n lần, trong đó n là số lượng thành phần TImage với hình ảnh đó được tải? :) – Drarok
Mỗi thành phần TImage lưu hình ảnh của nó độc lập với mọi phiên bản TImage khác.Vì vậy, nếu bạn tải cùng một hình ảnh vào n trường hợp của TImage, cùng một hình ảnh được lưu trữ n lần. Một cách để giải quyết vấn đề này là sử dụng mẫu thừa kế. Tạo một mẫu cơ sở với TImage và tải hình ảnh vào đó. Sau đó, lấy tất cả các biểu mẫu cần có cùng một TImage từ biểu mẫu đó. Bất kỳ thuộc tính nào không được thay đổi trong biểu mẫu con cháu chỉ được lưu trữ trong DFM của biểu mẫu tổ tiên. Điều đó bao gồm dữ liệu hình ảnh của một TImage. –
khá tương tự như ví dụ của tôi: http://www.ciuly.com/index.php/delphi/article/delphi/7-multimedia/10-pngfromresource.html
Đối với những người sử dụng C++ Builder mã này làm việc cho tôi:
Trong ResourceTest.rc nộp
IMG_BMP BITMAP "Ressources\\myimage.bmp";
IMG_PNG RCDATA "Ressources\\myimage.png";
Trong tập tin ResourceTest.rh
#ifndef ResourceTestRH
#define ResourceTestRH
#define IMG_BMP "IMG_BMP"
#define IMG_PNG "IMG_PNG"
#endif
Trong tệp ResourceTest.cpp
#include "pngimage.hpp"
// Loading bmp image from resource
Graphics::TBitmap *bmpImage = new Graphics::TBitmap();
bmpImage->LoadFromResourceName((int)HInstance, IMG_BMP);
// Loading png image from resource
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, IMG_PNG);
- 1. Tải tài nguyên png vào trong CBitMap
- 2. Làm cách nào để tải tài nguyên png vào điều khiển hình ảnh trên hộp thoại?
- 3. Làm cách nào để tải hình ảnh tài nguyên png trong Silverlight?
- 4. Cách thêm tài nguyên PNG trong Visual Studio 2010?
- 5. Làm cách nào để cập nhật Tài nguyên động trong một tài nguyên động?
- 6. Làm cách nào để có được BitmapImage từ Tài nguyên?
- 7. Cách tạo Bản vẽ từ tài nguyên
- 8. Tôi làm cách nào để lồng định danh tài nguyên?
- 9. Làm cách nào để tham chiếu tài nguyên trong Java?
- 10. Làm cách nào để gỡ lỗi tải tài nguyên JVM?
- 11. Làm cách nào để nhúng tệp tài nguyên vào C?
- 12. Làm cách nào để sao chép tệp từ Tài nguyên?
- 13. Làm cách nào để đặt tài nguyên drawableRight qua mã?
- 14. Firebase: Làm cách nào để cập nhật nhiều tài nguyên một cách nguyên tử?
- 15. Làm cách nào để tạo tài nguyên XML khi chạy trên Android?
- 16. Làm cách nào để bạn tạo tài nguyên đầu bếp tùy chọn?
- 17. Làm cách nào để chuyển các tệp tài nguyên bằng Thư viện tĩnh (Cách bọc tài nguyên trong gói)?
- 18. Làm cách nào để tạo tệp png w/selenium/phantomjs từ chuỗi?
- 19. Làm cách nào để tạo PNG 8 bit có độ trong suốt từ NSBitmapImageRep?
- 20. Làm cách nào để đưa tất cả tài nguyên vào một tệp html?
- 21. Cách tạo và sử dụng tài nguyên trong .NET
- 22. Làm cách nào để tạo tài khoản XMPP?
- 23. Cách lấy Tên tài nguyên từ id tài nguyên
- 24. Làm cách nào để kiểm tra xem tài nguyên được nhúng có tồn tại hay không?
- 25. Tạo từ điển tài nguyên tĩnh
- 26. Làm cách nào để khám phá "đường dẫn" của tài nguyên được nhúng?
- 27. Làm cách nào để tôi có thể tạo tài nguyên có thể đóng tự động đúng cách?
- 28. Tại sao gói tài nguyên sao chép tệp .png dưới dạng .tiff?
- 29. CMake: thêm tài nguyên tùy chỉnh để tạo thư mục
- 30. Làm thế nào để lấy chuỗi từ tài nguyên để gán trong phần WPF tài nguyên trong XAML
'RCDATA' có phải là loại tài nguyên cụ thể nhất có sẵn cho loại đồ họa đó không? Chẳng hạn, không có 'RT_PNG'? –
Câu hỏi hay, Rob. SDK nền tảng hiện được cài đặt của tôi là dành cho Windows Server 2003 R2 và tôi không thể tìm thấy một hằng số PNG cụ thể trong WinUser.h. Tôi không chắc chắn, mặc dù. Nó có thể được tuyên bố ở một nơi khác, có lẽ trong một phiên bản sau của Platform SDK. –
LoadFromResourceName đặc biệt tìm kiếm tài nguyên kiểu RCDATA. –